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

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

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

时间: 2024-11-08 18:15:51

[USACO1.4]母亲的牛奶 Mother's Milk的相关文章

洛谷 P1215 [USACO1.4]母亲的牛奶 Mother&#39;s Milk

题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的.由于节约,牛奶不会有丢失. 写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入输出格式 输入格式: 单独的一行包括三个整数A,B和C. 输出格式: 只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 输入输出样例 输入样例#1:

luogu P1215 [USACO1.4]母亲的牛奶 Mother&#39;s Milk

题目描述 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的.由于节约,牛奶不会有丢失. 写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入输出格式 输入格式: 单独的一行包括三个整数A,B和C. 输出格式: 只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 输入输出样例 输入样例#1:

$P1215 [USACO1.4]母亲的牛奶 Mother&#39;s Milk$

\(problem\) 搜索 找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 显然 我们需要一个数组来判重 表示这种状态出现过没有. 然而 储存答案. 需要一个桶?或者sort咯 不过多个cnt 我咧懒得打. 所以我们用一个\(vis[N][N][N] ;\) 来判重 表示这种状态出现过没有 出现过就直接返回. 然后用一个ans数组来储存答案\(ans[N] ;\) 都是布尔型的就行. 然后进入程序片段. 一共三个字母 则倒法有 \(3!=1*2*3=6\). 那就手工模拟好了.不用循环了

母亲的牛奶(milk) (BFS)

问题 A: 母亲的牛奶(milk) 时间限制: 1 Sec  内存限制: 64 MB提交: 14  解决: 8[提交][状态][讨论版] 题目描述 农民约翰有三个容量分别是A.B.C升的桶,A.B.C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一 个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的,由于节约,牛奶不会丢失.写一个程序去帮助约翰找出当A桶是空的时候,C桶中 牛奶所剩量的所有可能性. 输入 单独的1行,包括三个整数A,

母亲的牛奶(milk)

母亲的牛奶(milk) 题目描述 农民约翰有三个容量分别是A.B.C升的桶,A.B.C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了.当然每一次灌注都是完全的,由于节约,牛奶不会丢失.写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性. 输入 单独的1行,包括三个整数A,B和C. 输出 只有1行,列出当A桶是空的时候,C桶牛奶所剩量的所有可能性. 样例输入 8 9 10 样例输出 1 2

USACO1.5 Mother&#39;s Milk【搜索】

题目传送门 这道题还记得是我当年学广搜的时候做过. 如今再做,做了一个$dfs$版本的,比较简单,直接搞就可以了. 广搜的话,用结构体保存,然后塞到$queue$里面就可以了. 1 /* 2 ID: Starry21 3 LANG: C++ 4 TASK: ariprog 5 */ 6 #include<iostream> 7 #include<string> 8 #include<cstdio> 9 #include<cstring> 10 #includ

Mother&#39;s Milk

本题中, 三个桶,因此就是6种:A->B A->C B->A B->C C->A C->B.所有转移都考虑一遍即可. 以A->B来说,这样转移之后状态是什么呢?A的 牛奶数应该是max(0, a+b-B),其中a,b是A和B桶中原来牛奶的数量,A,B是A和B桶的容量.B的牛奶数是 min(a+b, B),其他的以此类推.本题就差不多了.~ 代码: /* ID:Andy Chen PROG: milk3 LANG: C++ */ #include <cstdi

USACO 1.4 Mother&#39;s Milk

Mother's Milk Farmer John has three milking buckets of capacity A, B, and C liters. Each of the numbers A, B, and C is an integer from 1 through 20, inclusive. Initially, buckets A and B are empty while bucket C is full of milk. Sometimes, FJ pours m

usaco Mother&#39;s Milk

给了三个木桶的容量,起始状态下C木桶装满,然后三个木桶相互倒牛奶,问当A木桶为空时的C木桶的牛奶体积的可能情况. 直接深度优先搜索,模拟三个木桶相互倒的情况 相互倒得情况本可以写的更简洁,但为了可阅读性我并没有这么干 不过这道题在本机上调试时,我曾将一个我认为无关紧要的地方写错,因为两个数组大小一样,所以在sizeof的括号中写了另外一个,结果却出不了正解. 有机会要好好查查memcyp函数的用法. /* ID: modengd1 PROG: milk3 LANG: C++ */ #includ