惭愧惭愧,差点没看出来这个就是裸的01背包
考虑到 当两组数值为
sum/2
s
u
m
/
2
的时候,差值最小
那么这个题就是一个一个背包容量为
sum/2
s
u
m
/
2
, 重量和价值都是数子本身大小的
01
01
背包 找到背包内最大的价值,就是分组相差最小的方案
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+10;
int dp[MAXN];
int v[MAXN];
int n, sum;
int main(int argc, char const *argv[])
{
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> v[i];
sum += v[i];
}
for (int i = 1; i <= n; ++i) {
for(int j = sum/2; j >= v[i]; j--) {
dp[j] = max(dp[j], dp[j-v[i]]+v[i]);
}
}
cout << sum-dp[sum/2]*2 << endl;
return 0;
}