【模拟递规】Mother's Milk 母亲的牛奶 (Usaco_Training 1.4)

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

 

 

posted @ 2012-10-18 09:46  jiangzh  阅读(591)  评论(0)    收藏  举报