1.4.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
/*
ID: ******
LANG: C++
TASK: milk3
*/


#include<cstdio>
#include<cstring>
#include <iostream>
#include <fstream>
using namespace std;
#define Max 21
int used[Max][Max][Max];//用于标识该情况是否已经搜索过
int ans[Max];//标记C的各种可能取值是否成立
int A,B,C;
void DFS(int a,int b,int c){//深搜
 if(used[a][b][c])return;//剪枝
 used[a][b][c]=true;//标识是否搜索过
 if(a==0&&!ans[c])//当A空了时记录C的值
  ans[c]=true;
//开始模拟6种可能的动作
 // c-->a
 if(c>=A-a)DFS(A,b,c-A+a);
 else DFS(a+c,b,0);
 //c-->b
 if(c>=B-b)DFS(a,B,c-B+b);
 else DFS(a,b+c,0);
 //a-->c
 DFS(0,b,a+c);
 //a-->b
 if(a>=B-b)DFS(a-B+b,B,c);
 else DFS(0,b+a,c);
 //b-->c
 DFS(a,0,C-a);
 //b-->a
 if(b>=A-a)DFS(A,b-A+a,c);
 else DFS(a+b,0,c);
}
int main(){
 ofstream fout ("milk3.out");
 ifstream fin ("milk3.in");
 fin>>A>>B>>C;
 memset(used,false,sizeof(used));
 memset(ans,false,sizeof(ans));
 DFS(0,0,C);
 for(int i=0;i<C;i++)
  if(ans[i])
   fout<<i<<" ";
 fout<<C<<endl;
 return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值