将一堆正整数分为2组,要求2组的和相差最小。
例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。
这道题就是要求在n个数字里面选出一些数,计算出这些数字的和,然后在计算出剩下数字的和然后求出这两个和的差的最小值,我们可以看出,关键就是怎么样选这些数字。
选数字,这就和01背包有点像了。我们可以先计算出这些数字的总和,然后将背包的容量看成是这个和的一半,然后从这些数字里面选出一些来看这个背包最多能装多少就可以了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int const maxn = 10005;
int dp[maxn];
int a[105];
int main()
{
int n,v,sum ;
while(scanf("%d",&n)!=EOF)
{
sum = 0 ;
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
v=sum/2;
memset(dp,0,sizeof(dp));
for(int i = 0 ; i < n ; i++)
{
for(int j = v ; j >= a[i] ; j--)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
printf("%d\n",sum-2*dp[v]);
}
return 0;
}