[USACO1.4]母亲的牛奶 Mother's Milk

题目

   

题目描述

农民约翰有三个容量分别是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

分析

   首先,我们可以看到数据规模。

  小于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 }

 

posted @ 2018-12-05 21:15  Melted_czj  阅读(778)  评论(0编辑  收藏  举报
body { background-color:whitesmoke; } // 修改背景颜色为半透明 #home,#sideBarMain>div,#blog-sidecolumn>div>div,.catListView{ background-color:rgba(255,255,255,0); } // 修改其他边框的颜色