USACO1.4.4 Mother's Mil

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;
}

猜你喜欢

转载自blog.csdn.net/codertcm/article/details/82730744
今日推荐