想法:注意此题不要用搜索+动态规划去优化做,直接常规动态规划就好,虽然前面325 题zb的生日与此题相似。
此题与325 题区别在于东西的值有大小;325题东西的值可以很大,所以用搜索+动态规划优化方法,此题,东西的值较小,应用常规动态规划合适。
思路没什么好说的:0-1背包问题改版
先排序,再想好动态转移方程;
给下动态转移方程:data[j]=max(data[j-a[i]]+a[i],data[j]);
代码:
#include<stdio.h> #include<string.h> int a[1010]; int data[100010]; int max(int x,int y) { return x>y?x:y; } int main() { int n,N; scanf("%d",&N); while(N--) { memset(a,0,sizeof(a)); memset(data,0,sizeof(data)); scanf("%d",&n); int i,j,t; int sum=0,sum1; for(i=1;i<=n;i++) { scanf("%d",&a[i]); sum=sum+a[i]; } sum1=sum/2; for(i=1;i<=n-1;i++) { for(j=1;j<=n-i;j++) { if(a[j]>a[j+1]) { t=a[j+1];a[j+1]=a[j];a[j]=t; } } } for(i=1;i<=n-1;i++) { for(j=sum1;j>=a[i];j--) { data[j]=max(data[j-a[i]]+a[i],data[j]); } } printf("%d\n",sum-2*data[sum1]); } return 0; }