代码
//B[k][w] k 前k个物品 w 剩下的空间
#include<iostream>
using namespace std;
#define N 6 //因为有5件商品
#define W 21//因为背包容量最大为20
//目的是为了出现 B[5][20]
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,cap;//第k个商品 cap当前背包的最大重量
for(k=1;k<N;k++){
for(cap=1;cap<W;cap++){
if(w[k]>cap) //当前物品的容量大于当前背包的容量
{
B[k][cap]=B[k-1][cap];//那么我就不能装入背包,只好舍弃这个物品
}
else{
int value1=B[k-1][cap-w[k]]+v[k];//放入背包后的价值
int value2=B[k-1][cap];//不放背包后的价值
B[k][cap]=value1>value2?value1:value2;//前k件物品,当容量为cap时的最大价值
}
}
}
}
int main()
{
knapsack();
cout<<B[5][20];
return 0;
}
辅助图
解释下图:
- 第一行表示当我没有物品的时候,不管背包容量多大,我的价值依旧为零
- 第一别表示,当我背包容量为零时,价值仍然为零。
参考资料
- 视频资源:灯神的视频 视频
- 纸质资料:背包九讲