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 }