D - Dividing coins
题意:
一堆钱都是只有一个,分两堆求能够使差最小的分配
思路:
只要其中一个尽可能接近总数的一半即可
#include<bits/stdc++.h>
using namespace std;
#define maxn 500111
int t,n,m,a[maxn],s;
int dp[maxn],sum;
int main()
{
cin>>t;
while(t--)
{
memset(dp,0,sizeof(dp));
cin>>n;
s=sum=0;
for(int i=1; i<=n; i++)
{
cin>>a[i];
s+=a[i];
}
sum=s;
s/=2;
for(int i=1; i<=n; i++)
for(int j=s; j>=a[i]; j--)
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
cout<<sum-2*dp[s]<<endl;
}
return 0;
}