USACO-Mother's Milk

http://ace.delos.com/usacoprob2?a=SZbyXoKqpyP&S=milk3

一题比较简单的搜索题。nocow上列出3种解法:http://www.nocow.cn/index.php/USACO/milk3

就我的感觉吧,方法一最简单而且最靠谱,而我的程序长得好像和方法一最像了= =

因为倒法只有6种(a倒b,a倒c,b倒a,b倒c,c倒a,c倒b),而且当且仅当倒出桶有牛奶才可以倒出。而倒出多少牛奶适合呢?这就关系到倒出桶的牛奶总量和倒入桶可承受的牛奶量了。具体的看程序。

#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;

bool f[100]={false};
bool ff[22][22][22]={false};
int aa,bb,cc;

void work(int a,int b,int c)
{
    if (ff[a][b][c]) return;         //三维数组判重,不过听说二维也可以
    ff[a][b][c]=true;
    if (a==0) f[c]=true;
    if (a!=0)
    {
        work(a-min(bb-b,a),b+min(bb-b,a),c);   //a->b
        work(a-min(cc-c,a),b,c+min(cc-c,a));   //a->c
    }
    if (b!=0)
    {
        work(a+min(aa-a,b),b-min(aa-a,b),c);   //b->a
        work(a,b-min(cc-c,b),c+min(cc-c,b));    //b->c
    }
    if (c!=0)
    {
        work(a+min(aa-a,c),b,c-min(aa-a,c));   //c->a
        work(a,b+min(bb-b,c),c-min(bb-b,c));   //c->b
    }
}

int main()
{
    freopen("milk3.in","r",stdin);
    freopen("milk3.out","w",stdout);
    cin>>aa>>bb>>cc;
    work(0,0,cc);
    for (int i=0;i<cc;i++)
    if (f[i]) cout<<i<<" ";
    cout<<cc<<endl;
    return 0;
}

diyi

第一次拿到first time!值得庆祝!

posted @ 2012-10-11 14:47  ay27  阅读(274)  评论(0编辑  收藏  举报