题目描述
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入输出格式
输入格式:单独的一行包括三个整数A,B和C。
输出格式:只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
输入输出样例
输入样例#1:
[输入1] 8 9 10 [输入2] 2 5 10
输出样例#1:
[输出1] 1 2 8 9 10 [输出2] 5 6 7 8 9 10
说明
题目翻译来自NOCOW。
USACO Training Section 1.4
爆搜六种情况,判重时只判断a和c就行.
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 //bool v[25][25][25]; 6 bool v[110][110]; 7 bool vc[110]; 8 int A,B,C,cnt; 9 10 void dfs(int a,int b,int c) 11 { 12 if (v[a][c]) return ; 13 v[a][c] = true; 14 if (a==0&&!vc[c]) vc[c] = true;; 15 if (c>0) 16 { 17 if (a<A) dfs(min(A,a+c),b,max(0,c-(A-a))); //c to a 18 if (b<B) dfs(a,min(B,b+c),max(0,c-(B-b))); //c to b 19 } 20 if (a>0) 21 { 22 if (b<B) dfs(max(0,a-(B-b)),min(B,b+a),c); //a to b 23 if (c<C) dfs(max(0,a-(C-c)),b,min(C,c+a)); //a to c 24 } 25 if (b>0) 26 { 27 if (a<A) dfs(min(A,a+b),max(0,b-(A-a)),c); //b to a 28 if (c<C) dfs(a,max(0,b-(C-c)),min(C,c+b)); //b to c 29 } 30 } 31 int main() 32 { 33 scanf("%d%d%d",&A,&B,&C); 34 dfs(0,0,C); 35 for (int i=C-B; i<=C; ++i) 36 if (vc[i]) printf("%d ",i); 37 return 0; 38 }