题目
题目描述
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入输出格式
输入格式:
单独的一行包括三个整数A,B和C。
输出格式:
只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
输入输出样例
分析
首先,我们可以看到数据规模。
小于20
很显然dfs 是不会爆的
于是我们枚举情况
a-b a-c
b-a b-c
c-a c-b
用一个桶数据记录数据就不用排序了
代码
1 #include<iostream> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 bool f[21][21][21]; 6 bool flag[21]; 7 int a,b,c; 8 void dfs(int aa,int bb,int cc) 9 { 10 if (f[aa][bb][cc]==1) return; 11 f[aa][bb][cc]=1; 12 if (aa==0) 13 flag[cc]=1; 14 if (cc) 15 { 16 if (aa<a) dfs(min(aa+cc,a),bb,max(cc-a+aa,0)); 17 if (bb<b) dfs(aa,min(cc+bb,b),max(cc-b+bb,0)); 18 } 19 if (aa) 20 { 21 if (bb<b) dfs(max(aa-(b-bb),0),min(bb+aa,b),cc); 22 if (cc<c) dfs(max(aa-(c-cc),0),bb,min(cc+aa,c)); 23 } 24 if (bb) 25 { 26 if (aa<a) dfs(min(aa+bb,a),max(bb-a+aa,0),cc); 27 if (cc<c) dfs(aa,max(bb-c+cc,0),min(cc+bb,c)); 28 } 29 30 } 31 int main () 32 { 33 34 cin>>a>>b>>c; 35 dfs(0,0,c); 36 for (int i=0;i<=21;i++) 37 if (flag[i]==1) 38 cout<<i<<" "; 39 }