您的位置:首页 > 大数据 > 人工智能

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

2012-10-18 09:46 645 查看
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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: