思路:这是一道01背包题,输入的所有数的和的一半作为背包中的容量,数字的个数相当于种类,如果这个和为奇数,那么就要2dp[sum/2]+1,这个可以自己带入1和12试一下。偶数就是2dp[sum/2]了
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int main()
{
int i,j,k,y,n,f,t,m,q,u,a[101],dp[50001];
cin>>u;
for(q=1;q<=u;q++)
{
cin>>n;
int sum=0;
for(i=1;i<=n;i++)
{
cin>>a[i];sum+=a[i];
}
a[0]=0;
for(i=0;i<=n;i++)
{
for(j=sum/2;j>=a[i];j--)
{
if(i==0||j==0)dp[j]=0;
else dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
if(sum%2==0)
{
cout<<2*(sum/2-dp[sum/2])<<endl;
}
else
{
cout<<2*(sum/2-dp[sum/2])+1<<endl;
}
}
return 0;
}