【模拟递规】Mother's Milk 母亲的牛奶 (Usaco_Training 1.4)
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

这一题和汉诺塔相似,用递规解决即可
主要注意几种转移状态即可
C++ Code
/*
ID: jiangzh15
TASK: milk3
LANG: C++
http://oijzh.cnblogs.com
*/
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;
int A,B,C;
bool h[30][30][30];
void dfs(int x,int y,int z)
{
if(h[x][y][z])return;
if(x==0) q.push(z);
h[x][y][z]=true;
//1->2
if(x+y<=B) dfs(0,x+y,z);
else if(x+y>B) dfs(x-(B-y),B,z);
//1->3
if(x+z<=C) dfs(0,y,x+z);
else if(x+z>C) dfs(x-(C-z),y,C);
//2->1
if(x+y<=A) dfs(x+y,0,z);
else if(x+y>A) dfs(A,y-(A-x),z);
//2->3
if(y+z<=C) dfs(x,0,y+z);
else if(y+z>C) dfs(x,y-(C-z),C);
//3->1
if(z+x<=A) dfs(x+z,y,0);
else if(z+x>A) dfs(A,y,z-(A-x));
//3->2
if(y+z<=B) dfs(x,y+z,0);
else if(y+z>B) dfs(x,B,y-(B-z));
}
int main()
{
freopen("milk3.in","r",stdin);
freopen("milk3.out","w",stdout);
scanf("%d%d%d",&A,&B,&C);
dfs(0,0,C);
while(q.size()>1){printf("%d ",q.top());q.pop();}
printf("%d\n",q.top());
return 0;
}

浙公网安备 33010602011771号