0
点赞
收藏
分享

微信扫一扫

序列拆分


​​传送门​​

题目描述

给出一个含有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));
}


举报

相关推荐

0 条评论