题意: 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到 另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约, 牛奶不会有丢失 写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
/* ID:jsntrdy1 PROG: milk3 LANG: C++ */ #include<cstdio> #include<iostream> #include<cstring> #include<fstream> using namespace std; const int N=30; int A,B,C; ifstream fin("milk3.in"); ofstream fout("milk3.out"); int m[N][N][N];//记录该状态是否出现过 int p[N];//记录 c 的可能取值 void f(int a,int b,int c) { //如果该状态已存在 if(m[a][b][c]) return; m[a][b][c]=1; //a空时 c的可能性 if(!a&&!p[c]) p[c]=1; //a->b if(a>B-b) f(a-(B-b),B,c); else f(0,a+b,c); //b->a if(b>A-a) f(A,b-(A-a),c); else f(a+b,0,c); //a->c if(a>C-c) f(a-(C-c),b,C); else f(0,b,c+a); //c->a if(c>(A-a)) f(A,b,c-(A-a)); else f(a+c,b,0); //b->c if(b>C-c) f(a,b-(C-c),C); else f(a,0,c+b); //c->b if(c>(B-b)) f(a,B,c-(B-b)); else f(a,b+c,0); } int main() { fin>>A>>B>>C; f(0,0,C); for(int i=0;i<C;i++) if(p[i]==1) fout<<i<<' '; fout<<C<<endl; return 0; }