USACO 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
简单的DFS,列出所有情况即可
/*
ID: xinming2
PROG: milk3
LANG: C++
*/
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <map>
#include <string>
#include <stack>
#include <ctype.h>
#include <vector>
using namespace std;
#define MAXN 20010
int a , b , c , f[25][25] = {0};//f记录是否有A桶有i升和B桶有j升的情况
void dfs(int i , int k)
{
    if(f[i][k])return ;
    f[i][k] = 1;
    dfs(0 , k);//A——>C  i升
    dfs(i , 0);//B——>C  k升
    //A,B桶互灌
    if(i >= b - k)dfs(i - b + k , b);
    else dfs(0 , i + k);
    if(k >= a - i)dfs(a , k - a + i);
    else dfs(i + k , 0);
    //j为C桶的剩余值,用C去灌A , B.
    int j = c - i - k;
    if(j >= a - i)dfs(a , k);
    else dfs(i + j , k);
    if(j >= b - k)dfs(i , b);
    else dfs(i , k + j);
}

int main()
{
    freopen("milk3.in","r",stdin);
    freopen("milk3.out","w",stdout);
    scanf("%d%d%d",&a,&b,&c);

    dfs(0 , 0);
    for(int i = 20 , g = 0 ; i >= 0 ; i--)//枚举B桶的奶量
    {
        if(f[0][i])
        {
            if(g)printf(" ");
            else g = 1;
            printf("%d",c - i);
        }

    }
    printf("\n");
    return 0;
}
/*

*/


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值