# P1215 [USACO1.4] 母亲的牛奶 Mother's Milk
## 题目描述
农民约翰有三个容量分别是 $a,b,c$ 升的桶。
最初,$a,b$ 桶都是空的,而 $c$ 桶是装满牛奶的。有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。
当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助农民找出当 $a$ 桶是空的时候,$c$ 桶中牛奶所剩量的所有可能性。
## 输入格式
单独的一行包括三个整数 $a,b,c$。
## 输出格式
只有一行,升序地列出当 $a$ 桶是空的时候,$c$ 桶牛奶所剩量的所有可能性。
## 输入输出样例 #1
### 输入 #1
```
8 9 10
```
### 输出 #1
```
1 2 8 9 10
```
## 输入输出样例 #2
### 输入 #2
```
2 5 10
```
### 输出 #2
```
5 6 7 8 9 10
```
## 说明/提示
【数据范围】
对于 $100\%$ 的数据,$1\le a,b,c \le 20$。
题目翻译来自NOCOW。
USACO Training Section 1.4
正解:
这道题经过我再三思考,我觉得没啥能说的,直接上代码
#include<iostream>
#include<algorithm>using namespace std;
const int N = 30;
bool vis[N][N][N];
bool ans[N];int A, B, C;
void dfs(int a, int b, int c)
{
if (vis[a][b][c]) return;
else vis[a][b][c] = 1;if (a == 0 && !ans[c]) ans[c] = 1;
if (c) {
//C->A
if (c >= (A - a)) //能倒满
{
dfs(A, b, c - A + a);
}
else dfs(a + c, b, 0);//C->B
if (c >= (B - b))
{
dfs(a, B, c - B + b);
}
else dfs(a, b + c, 0);
}if (a) {
//A->B
if (a >= (B - b))
{
dfs(a - B + b, B, c);
}
else dfs(0, b + a, c);//A->C
if (a >= (C - c))
{
dfs(a - C + c, b, C);
}
else dfs(0, b, c + a);
}if (b) {
//B->A
if (b >= (A - a))
{
dfs(A, b - A + a, c);
}
else dfs(a + b, 0, c);//B->C
if (b >= (C - c))
{
dfs(a, b - C + c, C);
}
else dfs(a, 0, c + b);
}return ;
}int main()
{
cin >> A >> B >> C;dfs(0, 0, C);
for (int i = 0; i < 30; i++)
if (ans[i]) cout << i << " ";return 0;
}