POJ 1014
code 1 #include <iostream>
2 using namespace std;
3
4 bool dp(int array[7])
5 {
6 bool flag[60001];
7 int i,j,k,sum = 0,max=0;
8 for(i=1;i<=6;i++)
9 {
10 sum += array[i]*i;
11 }
12
13 if(sum%2!=0)
14 {
15 return false;
16 }
17
18 memset(flag,0,sizeof(flag));
19 flag[0] = true;
20 for(i=1;i<=6;i++)
21 {
22 if(array[i]>0)
23 {
24 for(j=max;j>=0;j--)
25 {
26 if(flag[j])
27 {
28 for(k=1;k<=array[i];k++)
29 {
30 if(j+k*i==sum/2)
31 {
32 return true;
33 }
34
35 if(j+k*i>sum/2 || flag[j+k*i])
36 {
37 break;
38 }
39 flag[j+k*i] = true;
40 }
41 }
42 }
43 }
44 max += array[i]*i;
45 if(max>sum/2)
46 {
47 max = sum/2;
48 }
49 }
50 return false;
51 }
52
53 int main()
54 {
55 int count = 1;
56 int array[7];
57 while(true)
58 {
59 for(int i=1;i<=6;i++)
60 {
61 scanf("%d",&array[i]);
62 }
63
64 if(array[1]==0&&array[2]==0&&array[3]==0&&array[4]==0&&array[5]==0&&array[6]==0)
65 {
66 break;
67 }
68 else
69 {
70 if(!dp(array))
71 {
72 printf("Collection #%d:\nCan't be divided.\n\n",count++);
73 }
74 else
75 {
76 printf("Collection #%d:\nCan be divided.\n\n",count++);
77 }
78 }
79 }
80
81 return 0;
82 }
2 using namespace std;
3
4 bool dp(int array[7])
5 {
6 bool flag[60001];
7 int i,j,k,sum = 0,max=0;
8 for(i=1;i<=6;i++)
9 {
10 sum += array[i]*i;
11 }
12
13 if(sum%2!=0)
14 {
15 return false;
16 }
17
18 memset(flag,0,sizeof(flag));
19 flag[0] = true;
20 for(i=1;i<=6;i++)
21 {
22 if(array[i]>0)
23 {
24 for(j=max;j>=0;j--)
25 {
26 if(flag[j])
27 {
28 for(k=1;k<=array[i];k++)
29 {
30 if(j+k*i==sum/2)
31 {
32 return true;
33 }
34
35 if(j+k*i>sum/2 || flag[j+k*i])
36 {
37 break;
38 }
39 flag[j+k*i] = true;
40 }
41 }
42 }
43 }
44 max += array[i]*i;
45 if(max>sum/2)
46 {
47 max = sum/2;
48 }
49 }
50 return false;
51 }
52
53 int main()
54 {
55 int count = 1;
56 int array[7];
57 while(true)
58 {
59 for(int i=1;i<=6;i++)
60 {
61 scanf("%d",&array[i]);
62 }
63
64 if(array[1]==0&&array[2]==0&&array[3]==0&&array[4]==0&&array[5]==0&&array[6]==0)
65 {
66 break;
67 }
68 else
69 {
70 if(!dp(array))
71 {
72 printf("Collection #%d:\nCan't be divided.\n\n",count++);
73 }
74 else
75 {
76 printf("Collection #%d:\nCan be divided.\n\n",count++);
77 }
78 }
79 }
80
81 return 0;
82 }

浙公网安备 33010602011771号