北大ACM(POJ1014-Dividing)
Question:http://poj.org/problem?id=1014
问题点:抽屉原理、dfs、多重背包。
1 Memory: 248K Time: 16MS 2 Language: C++ Result: Accepted 3 4 #include <iostream> 5 using namespace std; 6 int arr_i[6]; 7 bool dfs(int v,int c) 8 { 9 if(v==0) return true; 10 if(c==0||v<0) return false; 11 for(int i=0;i<=arr_i[c-1];i++) 12 { 13 if(dfs(v-c*i,c-1)) return true; 14 } 15 return false; 16 } 17 int main() 18 { 19 int cnt=0; 20 while(true) 21 { 22 int sum,half,i,j,k,n,v; 23 cnt++; 24 for(i=0,sum=0,half=0;i<6;i++) 25 { 26 cin>>arr_i[i]; 27 sum+=arr_i[i]*(i+1); 28 switch(i) 29 { 30 case 0:if(arr_i[i]>6) arr_i[i]=6+arr_i[i]%2;break; 31 case 1:if(arr_i[i]>6) arr_i[i]=6+arr_i[i]%2;break; 32 case 2:if(arr_i[i]>6) arr_i[i]=6+arr_i[i]%2;break; 33 case 3:if(arr_i[i]>6) arr_i[i]=6+arr_i[i]%2;break; 34 case 4:if(arr_i[i]>6) arr_i[i]=6+arr_i[i]%2;break; 35 case 5:if(arr_i[i]>6) arr_i[i]=6+arr_i[i]%2;break; 36 } 37 half+=arr_i[i]*(i+1); 38 } 39 if(sum==0) break; 40 cout<<"Collection #"<<cnt<<":"<<endl; 41 if(sum%2==1){ 42 cout<<"Can't be divided."<<endl<<endl; 43 continue; 44 } 45 half/=2; 46 if(dfs(half,6)) cout<<"Can be divided."<<endl<<endl; 47 else cout<<"Can't be divided."<<endl<<endl; 48 } 49 return 0; 50 }