《算法十一》(背包问题)
问题描述:

2.问题分析:可以知道满足一个递归式
定义:B(i, j):i代表还有几件商品可以偷
j代表还剩下的背包空间是多少

例如:
如果是B(4,20)代表:有4件商品可以偷取,背包剩余空间还有20———>一系列计算————>26

3.定义B数组:

4.代码演示:
#include <iostream>
#include <iomanip>
#include <math.h>
#include <string.h>
#define N 6
#define W 21
using namespace std;
//B[i][j]:i代表还有几件商品可以偷
// j代表还剩下的背包空间是多少
int B[N][W] = {0};
int w[6] = {0, 2, 3, 4, 5, 9};//重量
int v[6] = {0, 3, 4, 5, 8, 10};//价值
void beibao(){
int k, c;
for(k=1; k<N; k++){//5个商品
for(c=1; c<W; c++){
if(w[k]>c){//第k件商品太重超过了背包空间c,不偷
B[k][c] = B[k-1][c];
}else{
//偷第k件商品
int value1 = B[k-1][c-w[k]] + v[k];
//不偷第k件商品
int value2 = B[k-1][c];
B[k][c] = value1 >= value2 ? value1:value2;
}
}
}
}
int main(void){
beibao();
cout << B[5][20] << endl;
return 0;
}

浙公网安备 33010602011771号