为了使自己的水题能力不会下降,本着“每天水一题 健康有活力”的宗旨,我决定从即日起,每天在usaco做一题,据说都做完后就变成大牛了,不知道真的假的,今天是第一题: /* ID: xincaor1 PROG: milk3 LANG: C++ */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; int bucketA,bucketB,bucketC; int states[30][30][30],amountC[30]; void dfs(int A,int B,int C) { if(A==0) amountC[C]=1; int tempA,tempB,tempC; if(C>0&&A<bucketA) { tempB=B; tempA=(bucketA-A<C)?bucketA:A+C; tempC=(bucketA-A>=C)?0:C-(bucketA-A); if(states[tempA][tempB][tempC]==0) { states[tempA][tempB][tempC]=1; dfs(tempA,tempB,tempC); } } if(C>0&&B<bucketB) { tempA=A; tempB=(bucketB-B<C)?bucketB:B+C; tempC=(bucketB-B>=C)?0:C-(bucketB-B); if(states[tempA][tempB][tempC]==0) { states[tempA][tempB][tempC]=1; dfs(tempA,tempB,tempC); } } if(B>0&&A<bucketA) { tempC=C; tempA=(bucketA-A<B)?bucketA:A+B; tempB=(bucketA-A>=B)?0:B-(bucketA-A); if(states[tempA][tempB][tempC]==0) { states[tempA][tempB][tempC]=1; dfs(tempA,tempB,tempC); } } if(B>0&&C<bucketC) { tempA=A; tempC=(bucketC-C<B)?bucketC:C+B; tempB=(bucketC-C>=B)?0:B-(bucketC-C); if(states[tempA][tempB][tempC]==0) { states[tempA][tempB][tempC]=1; dfs(tempA,tempB,tempC); } } if(A>0&&B<bucketB) { tempC=C; tempB=(bucketB-B<A)?bucketB:B+A; tempA=(bucketB-B>=A)?0:A-(bucketB-B); if(states[tempA][tempB][tempC]==0) { states[tempA][tempB][tempC]=1; dfs(tempA,tempB,tempC); } } if(A>0&&C<bucketC) { tempB=B; tempC=(bucketC-C<A)?bucketC:C+A; tempA=(bucketC-C>=A)?0:A-(bucketC-C); if(states[tempA][tempB][tempC]==0) { states[tempA][tempB][tempC]=1; dfs(tempA,tempB,tempC); } } } int main() { freopen("milk3.in","r",stdin); freopen("milk3.out","w",stdout); memset(states,0,sizeof(states)); memset(amountC,0,sizeof(amountC)); cin>>bucketA>>bucketB>>bucketC; states[0][0][bucketC]=1; dfs(0,0,bucketC); int c=0; for(int i=0;i<=20;i++) if(amountC[i]) { if(c==0) { cout<<i; c=1; } else cout<<" "<<i; } cout<<endl; return 0; }