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

该博客介绍了如何使用递归方法解决Usaco Training中的一道题目,即Mother's Milk。题目涉及三个容量为1到20升的桶,初始时一桶满,两桶空,需要在不浪费牛奶的情况下将奶从一桶倒入另一桶,直至某一桶空。博主通过分析转移状态,给出了利用递归解决此类问题的方法,并提供了C++代码实现。
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://blog.csdn.net/jiangzh7
*/
#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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值