传送门
题目描述
给出一个含有nn个数的整数序列,把它拆分成两个序列,使分成的两个序列之和的差值最小
输入格式
第一行一个正整数n,第二行含n个正整数的序列a[n]。
输出格式
一个正整数表示分成的两个子序列之和的最小差值
思路:
先得出序列的总值sum,然后用01背包解法找到小于等于sum/2的子序列。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[110];
int dp[1100000];
int main()
{
int n;
cin>>n;
int sum = 0;
for(int i = 1; i <= n; i++)
{
cin>>a[i];
sum += a[i];
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
for(int j = sum/2;j >= a[i]; j--)
{
dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
if(dp[j] <= sum/2 && dp[j] >= ans)
{
ans = dp[j];
}
}
}
printf("%d\n",abs(sum-2*ans));
}