POJ1014Dividing(DP)

http://poj.org/problem?id=1014

最简单之多重背包

 1 #include <map>
 2 #include <set>
 3 #include <stack>
 4 #include <queue>
 5 #include <cmath>
 6 #include <ctime>
 7 #include <vector>
 8 #include <cstdio>
 9 #include <cctype>
10 #include <cstring>
11 #include <cstdlib>
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15 #define INF 0x3f3f3f3f
16 #define MAX(a,b) (a > b ? a : b)
17 #define MIN(a,b) (a < b ? a : b)
18 #define mem0(a) memset(a,0,sizeof(a))
19 
20 typedef long long LL;
21 const double eps = 1e-12;
22 const int MAXN = 1005;
23 const int MAXM = 5005;
24 
25 int num[7], DP[60005], F;
26 
27 void ZeroOnePack(int v)
28 {
29     for(int i=F;i>=v;i--)
30     {
31         DP[i] = max(DP[i], DP[i-v]+v);
32     }
33 }
34 
35 void CompletePack(int v)
36 {
37     for(int i=v;i<=F;i++)
38     {
39         DP[i] = max(DP[i], DP[i-v]+v);
40     }
41 }
42 
43 int ComplexPack()
44 {
45     for(int i=1;i<=6;i++)
46     {
47         if(num[i]*i >= F) CompletePack(i);
48         else
49         {
50             int k = 1;
51             while(k <= num[i])
52             {
53                 ZeroOnePack(k*i);
54                 num[i] -= k;
55                 k *= 2;
56             }
57             ZeroOnePack(num[i]*i);
58         }
59     }
60     return DP[F];
61 }
62 
63 int main()
64 {
65     int T=0;
66     while(scanf("%d%d%d%d%d%d", &num[1],&num[2],&num[3],&num[4],&num[5],&num[6]))
67     {
68         if(!(num[1]||num[2]||num[3]||num[4]||num[5]||num[6])) break;
69         F = 0; mem0(DP);
70         for(int i=1;i<=6;i++) F += num[i]*i;
71         printf("Collection #%d:\n", ++T);
72         if(F & 1) {printf("Can't be divided.\n\n"); continue;}
73         F /= 2;
74         printf("%s\n\n", ComplexPack()==F?"Can be divided.":"Can't be divided.");
75     }
76     return 0;
77 }

 

posted @ 2013-11-24 21:31  再见~雨泉  阅读(198)  评论(0编辑  收藏  举报