题目描述
给出一堆魔法石的重量,问如何分成两堆,使得它们质量和之差最小,求出这个最小值。
输入
第一行一个数n (n ≤30)。 接下来n行,每行一个正整数。(每个数≤100000)
输出
一个整数表示两组数字和的最小差。
样例输入 Copy
5
1 2 3 4 5
样例输出 Copy
1
解析:
转化为0/1背包问题。求出数组的和sum
把问题转化成:背包的容量为sum/2,把数组的每个数字看成物品的体积,求出背包最多可以放res 体积的物品,返回结果∣res−(sum−res)∣
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1000;
int f[N];
int a[N];
int main()
{
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++ )cin>>a[i],sum+=a[i];
for(int i=1;i<=n;i++)
for(int j=sum/2;j>=a[i];j--)
f[j]=max(f[j],f[j-a[i]]+a[i]);
int res=f[sum/2];
cout<<abs(res-(sum-res))<<endl;
}