第1行:一个数N,N为正整数的数量。 第2 - N+1行,N个正整数。 (N <= 100, 所有正整数的和 <= 10000)
输出这个最小差
5 1 2 3 4 5
1
分析:
从题目中来看可看出是一个类似01背包的问题,先求出数的总和,算出平均数,然后套用01背包公式:f[j]=max(f[j],f[j-w[i]]+c[i]),稍稍改动(因为没有重量,所以用正整数代替)。
代码
#include<bits/stdc++.h>
using namespace std;
int n,sum=0,a[1001],b[100001]={0};
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i]; //计算总和
}
int m=sum/2; //平均值
for(int i=1;i<=n;i++) //01背包
for(int j=m;j>=a[i];j--)
b[j]=max(b[j],b[j-a[i]]+a[i]);
cout<<sum-2*b[m]; //总和减去较小组的值的两倍剩下两组之差
return 0;
}
2018 7 14 14:28
ppdessert