zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    分布式系统之CAP理论杂记
    RPC详解
    玩转zookeeper命令
    NRPE介绍
    开启irqbalance提升服务器性能
    xinetd被动服务唤醒
    服务发现的基本原理[转]
    关于TCP/IP,必知必会的十个经典问题[转]
    Smart Client技术简要总结
    使用ng-grid实现可配置的表格
  • 原文地址:https://www.cnblogs.com/xlqtlhx/p/7574263.html
Copyright © 2011-2022 走看看