灵异背包问题

1.例题如下:

给出商品的重量及价值如下图所示,背包的最大容量为20,问如何选择能获得最大价值。
灵异背包问题_第1张图片

2.例题分析:

灵异背包问题,B(k,C)k表示前k个商品,C表示背包剩余空间。B(k,C)= B(k-1,C)表示第k件太重不选第k件;B(k,C)= B(k-1,C-Wk)+Vk表示选第k件,背包中减掉k的重量,价值中加上k的价值。

3.代码如下:

#include
#define N 6 //商品数量
#define W 21//背包容量
int B[N][W]={0};
int w[6]={0,2,3,4,5,9};//商品重量
int v[6]={0,3,4,5,8,10};//商品价值
void knapsack(){
	int k,C;//C为背包容量
	for(k=1;k<N;k++){
		for(C=1;C<W;C++){
			if(w[k]>C){//第k件商品重量大于背包容量
				B[k][C]=B[k-1][C];//不选第k件
			}else{
				int value1=B[k-1][C-w[k]]+v[k];//选第k件
				int value2=B[k-1][C];//不选第k件
				if(value1>value2){
					B[k][C]=value1;
				}else{
					B[k][C]=value2;
				}
			}
		}
	}
}
int main(){
	knapsack();
	printf("%d\n",B[5][20]);//输出最大价值
	return 0;
}

你可能感兴趣的:(灵异背包问题)