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 milk from one bucket to another until the second bucket is filled or the first bucket is empty. Once begun, a pour must be completed, of course. Being thrifty, no milk may be tossed out.
Write a program to help FJ determine what amounts of milk he can leave in bucket C when he begins with three buckets as above, pours milk among the buckets for a while, and then notes that bucket A is empty.
PROGRAM NAME: milk3
INPUT FORMAT
A single line with the three integers A, B, and C.
SAMPLE INPUT (file milk3.in)
8 9 10
OUTPUT FORMAT
A single line with a sorted list of all the possible amounts of milk that can be in bucket C when bucket A is empty.
SAMPLE OUTPUT (file milk3.out)
1 2 8 9 10
SAMPLE INPUT (file milk3.in)
2 5 10
SAMPLE OUTPUT (file milk3.out)
5 6 7 8 9 10
/*
ID: ******
LANG: C++
TASK: milk3
*/
#include<cstdio>
#include<cstring>
#include <iostream>
#include <fstream>
using namespace std;
#define Max 21
int used[Max][Max][Max];//用于标识该情况是否已经搜索过
int ans[Max];//标记C的各种可能取值是否成立
int A,B,C;
void DFS(int a,int b,int c){//深搜
if(used[a][b][c])return;//剪枝
used[a][b][c]=true;//标识是否搜索过
if(a==0&&!ans[c])//当A空了时记录C的值
ans[c]=true;
//开始模拟6种可能的动作
// 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);
//a-->c
DFS(0,b,a+c);
//a-->b
if(a>=B-b)DFS(a-B+b,B,c);
else DFS(0,b+a,c);
//b-->c
DFS(a,0,C-a);
//b-->a
if(b>=A-a)DFS(A,b-A+a,c);
else DFS(a+b,0,c);
}
int main(){
ofstream fout ("milk3.out");
ifstream fin ("milk3.in");
fin>>A>>B>>C;
memset(used,false,sizeof(used));
memset(ans,false,sizeof(ans));
DFS(0,0,C);
for(int i=0;i<C;i++)
if(ans[i])
fout<<i<<" ";
fout<<C<<endl;
return 0;
}