Ray's playground

 

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 }

 

posted on 2010-08-19 21:52  Ray Z  阅读(234)  评论(0)    收藏  举报

导航