NYOJ 456 邮票分你一半

地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=456

思路:

以价值的总和的一半为背包容量,构建0-1背包,只要保证一半的背包容量装的价值最大就行。。因为最大也就是总价值的一半。。

 1 //0-1 背包
 2 #include<stdio.h>
 3 #include<string.h>
 4 int val[500001];   //存放当前的最大容量 
 5 int main()
 6 {
 7     int n,m,i,j,sum;
 8     int a[1001];
 9     scanf("%d",&m);
10     while(m--)
11     {
12         memset(val,0,sizeof(val));
13         scanf("%d",&n);
14         sum=0;
15         for(i=0;i<n;++i)
16         {
17             scanf("%d",&a[i]);
18             sum+=a[i];
19         }
20         for(i=0;i<n;++i)
21             for(j=sum/2;j>=a[i];--j)
22                 if(val[j]<val[j-a[i]]+a[i])
23                     val[j]=val[j-a[i]]+a[i];
24         printf("%d\n",sum-2*val[sum/2]);
25     }
26     return 0;
27 }

 

posted on 2012-08-14 19:55  mycapple  阅读(432)  评论(0编辑  收藏  举报

导航