码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-12-05 21:52:58      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:mes   bad   输出   std   amp   copy   容量   整数   names   

题目

   

题目描述

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

 

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

标签:mes   bad   输出   std   amp   copy   容量   整数   names   

原文地址:https://www.cnblogs.com/zjzjzj/p/10073461.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!