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背包问题,这两行(程序中标注)是干嘛?为啥又要减?