母亲的牛奶(milk)
题目描述
农民约翰有三个容量分别是A、B、C升的桶,A、B、C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的。有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的,由于节约,牛奶不会丢失。写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入
单独的1行,包括三个整数A,B和C。
输出
只有1行,列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
样例输入
8 9 10
样例输出
1 2 8 9 10 分析:考虑所有情况即可,暴力转移;代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include <ext/rope> #define rep(i,m,n) for(i=m;i<=n;i++) #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++) #define vi vector<int> #define pii pair<int,int> #define mod 1000000007 #define inf 0x3f3f3f3f #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) const int maxn=1e3+10; const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}}; using namespace std; using namespace __gnu_cxx; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;} int n,m,k; set<int>ans; struct node { int x,y,z; bool operator<(const node&r)const { if(x==r.x&&y==r.y)return z<r.z; else if(x==r.x)return y<r.y; else return x<r.x; } }; map<node,int>p; void dfs(node u) { if(p[u]==1)return; p[u]=1; if(u.x==0)ans.insert(u.z); if(u.x<n) { if(u.y) { node v=u; v.x+=min(n-u.x,u.y); v.y-=min(n-u.x,u.y); dfs(v); } if(u.z) { node v=u; v.x+=min(n-u.x,u.z); v.z-=min(n-u.x,u.z); dfs(v); } } if(u.y<m) { if(u.x) { node v=u; v.y+=min(m-u.y,u.x); v.x-=min(m-u.y,u.x); dfs(v); } if(u.z) { node v=u; v.y+=min(m-u.y,u.z); v.z-=min(m-u.y,u.z); dfs(v); } } if(u.z<k) { if(u.x) { node v=u; v.z+=min(k-u.z,u.x); v.x-=min(k-u.z,u.x); dfs(v); } if(u.y) { node v=u; v.z+=min(k-u.z,u.y); v.y-=min(k-u.z,u.y); dfs(v); } } } int main() { int i,j,t; scanf("%d%d%d",&n,&m,&k); node q; q.x=0,q.y=0,q.z=k; dfs(q); printf("%d",*ans.begin()); for(set<int>::iterator it=ans.begin();it!=ans.end();it++) { if(it==ans.begin())continue; else printf(" %d",*it); } printf("\n"); //system ("pause"); return 0; }
时间: 2024-10-12 22:05:47