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 }

 

你可能感兴趣的:(OJ)