POJ 2576 Tug of War二维背包恰好装满.

像这种恰好装满的情况可以用bool数组,恰好装满为true,否则为false。

还有就是逆向推倒,0-1背包,f[i][j]表示有i个人,组成了j的体重,这样的话在考虑某人的情形时,f[i][j]为真的前提就是f[i-1][j-wi]为真,其中wi为这个人的体重

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 bool f[110][2500];
 5 int main()
 6 {
 7     int n,w[110],sum = 0;
 8     scanf("%d\n",&n);
 9     memset(f,false,sizeof(f));
10     f[0][0] = true;
11     for(int i=0; i<n; i++)
12     {
13         scanf("%d",&w[i]);
14         sum += w[i];
15     }
16     int v = n/2;
17     for(int i=0; i< n; i++)
18     {
19         for(int j = v; j >= 0; j--)
20         {
21             for(int k=sum; k >= 0; k--)
22             {
23                 if( j >=1 && k>= w[i] &&f[j-1][k-w[i]])
24                     f[j][k] = true;
25             }
26         }
27     }
28     int mi1=0,mi2=sum;
29     double dif = sum;
30     for(int i=sum-1; i>=0; i--)
31     {
32         if(f[v][i] && dif>fabs(sum-2*i))
33         {
34             mi1 = i;
35             mi2 = sum-i;
36             dif = fabs(sum-2*i);
37         }
38     }
39     if(mi1 > mi2)
40         printf("%d %d\n",mi2,mi1);
41     else  printf("%d %d\n",mi1,mi2);
42     return 0;
43 }

 

 

posted on 2013-03-27 21:22  allh123  阅读(272)  评论(0编辑  收藏  举报

导航