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
代码:
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 int x,y,z; 7 int cnt=0; 8 int v[200100]; 9 int ans[30]; 10 11 void dfs(int a, int b ,int c){ 12 13 if(v[a*10000+b*1000+c]==1) 14 { 15 return; 16 } 17 v[a*10000+b*1000+c]=1; 18 if(a==0){ 19 cnt++; 20 ans[c]=1; 21 } 22 // c--->a,b 23 if(c!=0){ 24 //c->a 25 if(a+c>=x&&a!=x) dfs(x,b,c-x+a); 26 else if(a+c<x) dfs(a+c,b,0); 27 //c->b 28 if(b+c>=y&&b!=y) dfs(a,y,c-y+b); 29 else if(b+c<y) dfs(a,b+c,0); 30 } 31 // b--->a,c 32 if(b!=0){ 33 //b->a 34 if(b+a>=x&&a!=x) dfs(x,b+a-x,c); 35 else if(b+a<x) dfs(b+a,0,c); 36 //b->c 37 if(b+c>=z&&c!=z) dfs(a,b+c-z,z); 38 else if(b+c<z) dfs(a,0,b+c); 39 } 40 // a--->c,b 41 if(a!=0){ 42 //a->c 43 if(a+c>=z&&c!=z) dfs(a+c-z,b,z); 44 else if(a+c<z) dfs(0,b,a+c); 45 //a->b 46 if(b+a>=y&&b!=y) dfs(a+b-y,y,c); 47 else if(a+b<y) dfs(0,a+b,c); 48 } 49 } 50 51 52 int main() { 53 freopen("milk3.in","r",stdin); 54 freopen("milk3.out","w",stdout); 55 cin>>x>>y>>z; 56 memset(v,0,sizeof(v)); 57 memset(ans,0,sizeof(ans)); 58 cnt=0; 59 dfs(0,0,z); 60 int k=0; 61 for(int i=0;i<=20;i++){ 62 if(ans[i]){ 63 if(k) cout<<" "; 64 k++; 65 cout<<i; 66 } 67 } 68 cout<<endl; 69 return 0; 70 }