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 }