集合划分差最小问题(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背包,打印路径)
背包DPJury Compromise POJ - 1015