题目大意:有N个苹果,要把这些苹果粉给2个人,使得这两个人得到的苹果重量差最小。
先求得N个苹果的重量总和,分成两堆,差值最小,则有一堆大于或等于SUM/2;有一堆小于等于SUM/2;
所以有for(j=sum/2;j>=w[i];j--);只要dp【j】从最大开始第一个等于一的下标就是其中一堆的和,
#include<stdio.h>
#include<string.h>
int dp[100005];
int data[1002];
int n,sum,target;
int main()
{
int i,j,x;
scanf("%d",&x);
while(x--)
{
scanf("%d",&n);
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&data[i]);
sum+=data[i];
}
target=sum/2;
memset(dp,0,sizeof(dp));
dp[0]=1;
for(i=0;i<n;i++)
for(j=target;j>=data[i];j--)
if(dp[j-data[i]])
dp[j]=1;
for(i=target;i>=0;i--)
if(dp[i])
break;
printf("%d\n",sum-2*i);
}
return 0;
}