北大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 }

 

 
posted @ 2016-11-22 16:01  月生丶  阅读(346)  评论(0)    收藏  举报