问题描述:
0-1背包(0-1 knapsack):
有一个背包,体积为V,现在有 n 个物体,且物体 i 的价值为 pi,要求在不超过背包体积 V 的情况下背包中放入物体的最大价值之和;
如:4 8
2 1
4 1
2 4
3 3

问题分析:

0-1背包_#include

#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;
}