集合划分差最小问题(01背包)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合划分差最小问题(01背包)相关的知识,希望对你有一定的参考价值。

集合划分差最小问题(01背包)

一个序列分为两个集合,使得两个集合数的和差值最小。

考虑背包,容量为 s u m 2 \\dfracsum2 2sum,转化为判定问题。

#include<bits/stdc++.h>
using namespace std;
const int N=5e3+5;
int n,s;
int a[N];
bool dp[N];
int main()

	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),s+=a[i];
    int m = s>>1;
    dp[0] = true;
    for(int i=1;i<=n;i++)
    	for(int j=m;j>=a[i];j--)
    		dp[j]|=dp[j-a[i]];
    int ans = 0;
    for(int i=m;i;i--)
    	if(dp[i])
    		ans=s-(i<<1);
    		break;
    	
    
    printf("%d\\n",ans);
    return 0;

如果要输出方案,就再开一个 p r e pre pre数组记录使用的数,然后dfs输出路径。

以上是关于集合划分差最小问题(01背包)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1015 / UVA 323 Jury Compromise(01背包,打印路径)

将元素平分成差值最小的两个集合(DP)

背包DPJury Compromise POJ - 1015

P1466 集合 Subset Sums(01背包求填充方案数)

530. 二叉搜索树的最小绝对差

530. 二叉搜索树的最小绝对差