码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-22 13:01:59      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:using   highlight   namespace   ace   int   ems   ret   style   ios   

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

解答: 比如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(伪背包问题)

标签:using   highlight   namespace   ace   int   ems   ret   style   ios   

原文地址:http://www.cnblogs.com/xlqtlhx/p/7574263.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!