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; }
第一次拿到first time!值得庆祝!