母亲的牛奶

· · 题解

题目描述

农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从120的整数, 最初,AB桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。

写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。

输入输出格式

输入格式:

单独的一行包括三个整数A,BC

输出格式:

只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。

输入输出样例

输入样例1

8 9 10

输出样例1

1 2 8 9 10

输入样例2

2 5 10

输出样例2

5 6 7 8 9 10

这是一道搜索类型题,只需搜索各种情况即可,可以深搜或广搜

深搜代码如下:

#include<cstdio>
bool pj[23],bj[23][23][23];
int a,b,c;
void dfs(int aa,int bb,int cc) {
    if(!bj[aa][bb][cc]) {//记忆化
        if(!aa) {
            pj[cc]=1;//记录符合条件情况
        }
        bj[aa][bb][cc]=1;
        if(b-bb<=aa) {//a向b倒牛奶,b可以被倒满
            dfs(aa-b+bb,b,cc);
        } else {//a向b倒牛奶,b不可以被倒满
            dfs(0,bb+aa,cc);
        }
        if(c-cc<=aa) {//a向c倒牛奶,c可以被倒满
            dfs(cc+aa-c,bb,c);
        } else {//a向c倒牛奶,c不可以被倒满
            dfs(0,bb,cc+aa);
        }
        if(c-cc<=bb) {//b向c倒牛奶,c可以被倒满
            dfs(aa,bb-c+cc,c);
        } else {//b向c倒牛奶,c不可以被倒满
            dfs(aa,0,cc+bb);
        }
        if(a-aa<=bb) {//b向a倒牛奶,a可以被倒满
            dfs(a,bb-a+aa,cc);
        } else {//b向a倒牛奶,a不可以被倒满
            dfs(aa+bb,0,cc);
        }
        if(a-aa<=cc) {//c向a倒牛奶,a可以被倒满
            dfs(a,bb,cc-a+aa);
        } else {//c向a倒牛奶,a不可以被倒满
            dfs(cc+aa,bb,0);
        }
        if(b-bb<=cc) {//c向b倒牛奶,b可以被倒满
            dfs(aa,b,cc-b+bb);
        } else {//c向b倒牛奶,b不可以被倒满
            dfs(aa,cc+bb,0);
        }
    }
    return;
}
int main() {
    scanf("%d%d%d",&a,&b,&c);//记录各桶容积
    dfs(0,0,c);//从初始情况开始搜索
    for(int i=0; i<=c; i++) {
        if(pj[i]) {
            printf("%d",i);
            putchar(' ');
        }
    }
    return 0;
}