0-1背包问题详解1(伪背包问题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0-1背包问题详解1(伪背包问题)相关的知识,希望对你有一定的参考价值。

题目:给出一个数组,将其分为两份,使得这两份差值最小。

解答: 比如a={4,3,2,1},其实只要让其逼近sum(a)/2即可,所以可以等效于一个背包容量为5,从a中取出若干件物品,将其装满,但是这样会出现问题,就是4+1,3+1都符合条件,(如果我们假设他们价值为1的话,受网上误导很大),事实上,可以假设其价值就是他们的重量,那么该问题就会在尽可能装满背包的前提下同时尽可能取更大的数,而同时所得到最终价值也正是我们取出来的数组的和,便于计算,代码如下:

 

#include<iostream>
#include<memory.h>
using namespace std;
int main()
{
	int w[1000];
	int v[1000];
	int V;
	int temp,N;
	cin>>N;
	int sum=0;
	for(int i=1;i<=N;i++)
	{
		cin>>temp;
		sum+=temp;
		w[i]=temp;
		v[i]=temp;
	}
	V=sum/2;
	int f[N+1][V+1];
	memset(f,0,sizeof(f));
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=V;j++)
		{
			if(w[i]>j)
			f[i][j]=f[i-1][j];
			else
			{
				int a=f[i-1][j-w[i]]+v[i];
				int b=f[i-1][j];
				if(a>b)
				f[i][j]=a;
				else
				f[i][j]=b;
			}
		}
	}

	cout<<sum-2*f[N][V]<<endl;
	return 0;
}

 

  

 

以上是关于0-1背包问题详解1(伪背包问题)的主要内容,如果未能解决你的问题,请参考以下文章

0-1背包问题的回溯法代码

0-1背包问题的回溯法中,剪枝用的上界函数问题

用回溯法做0-1背包问题,这两行(程序中标注)是干嘛?为啥又要减?

0-1背包问题如下,画用回溯法求解时的搜索情况,急用啊

参赛博文|0-1背包问题(动态规划)附例题详解——java实现

0x52. 动态规划 - 背包(习题详解 × 19)