问题描述:
0-1背包(0-1 knapsack):
有一个背包,体积为V,现在有 n 个物体,且物体 i 的价值为 pi,要求在不超过背包体积 V 的情况下背包中放入物体的最大价值之和;
如:4 8
2 1
4 1
2 4
3 3
问题分析:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,w;
int a[1000],b[1000];
int d[1000]= {0};//路径记录
int m(int i,int j) {
if(i==n-1)//最下面一层寻找可选物品
if(j>=b[i]) {//若剩下的能放下b[n-1]就放入
d[i]=1;
return a[i];
} else return 0;
if(j>=b[i])//当不是最后一层时,并且能放入背包,有两种选择:放还是不放,比较两者的价值最优并记录路径
if(m(i+1,j)>m(i+1,j-b[i])+a[i]) {
d[i]=0;
return m(i+1,j);
~~~ } else {
d[i]=1;
return m(i+1,j-b[i])+a[i];
}
else {//不够放时,遍历下一个
b[i]=0;
return m(i+1,j);
}
}
int main() {
scanf("%d%d",&n,&w);
for(int i=0; i<n; ++i)
scanf("%d%d",b+i,a+i);
printf("%d\n",m(0,w));
for(int i=0; i<n; ++i)
printf("%d ",d[i]);
return 0;
}