题目描述 Description
已知有一堆西瓜,请帮忙将这一堆西瓜分成两堆,已知每个西瓜的重量,现在要求分成两堆的西瓜的重量的差最小
输入描述 Input Description
第一行输入西瓜数量N (1 ≤ N ≤ 20)
第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量
输出描述 Output Description
输出分成两堆后的质量差
样例输入 Sample Input
5 5 8 13 27 14
样例输出 Sample Output
3
这是一道十分基础的01背包,废话不多说,直接上代码
#include<iostream>
using namespace std;
int n,f[100005],a[25],v;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
v+=a[i];
}
int v1=v;
v/=2;
for(int i=1;i<=n;i++)
{
for(int j=v;j>=a[i];j--)
{
f[j]=max(f[j],f[j-a[i]]+a[i]);
}
}
cout<<v1-f[v]*2;
return 0;
}