Description
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的。有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。 写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
Input
单独的一行包括三个整数A,B和C。
Output
只有一行,列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
Sample Input
8 9 10
Sample Output
1 2 8 9 10
运用dfs的思想,遍历所有情况。
对于被灌桶装满或原桶空,可以用min 函数
例:c往b里倒 b= b+min(vb-b,c) c= c-min(vb-b,c)
每判断一种情况,就记录下此时a,b,c桶的牛奶量,当下次出现已经判断过的情况的话,就可以返回。
因为a+b+c是一个定值,只需记录a,b桶的状态就行了。
(做题时,忘了a和c桶都为空的情况)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int va,vb,vc;
int ha[21];
int mp[21][21];
void f(int a,int b,int c)
{
if(a==0)
ha[c]=1;
if(mp[a][b]==1)
return ;
else
mp[a][b]=1;
f(a,b+min(vb-b,c),c-min(vb-b,c));
f(a+min(va-a,c),b,c-min(va-a,c));
f(a+min(va-a,b),b-min(va-a,b),c);
f(a,b-min(vc-c,b),c+min(vc-c,b));
f(a-min(vb-b,a),b+min(vb-b,a),c);
f(a-min(vc-c,a),b,c+min(vc-c,a));
return ;
}
int main()
{
int flag=1;
scanf("%d%d%d",&va,&vb,&vc);
f(0,0,vc);
for(int i=0; i<=20; i++)
if(ha[i]==1){
if(flag)
printf("%d",i),flag=0;
else
printf(" %d",i);
}
return 0;
}