知识点:相较于01背包,多重背包对于物品的数量限制为多个
1、状态:dp[i]:容量为i的背包的最大价值
2、状态方程:使用二进制优化之后,与01背包没有差异
3、初始化:容量与物品为0的时候dp为0;
核心点:二进制优化,由于计算机01的特性,可以简单地通过位运算进行拆分,将同一种类型的物品分为不同块,近似于01背包的运算。
#include <iostream>
#include <cmath>
using namespace std;
const int x = 1000010;
//宝物种数和最大承重
int n,W;
//宝物的价值与重量
int value[x],weight[x];
int cnt=0;
int a,b,c;
//状态保存
int dp[x];
int main(){
cin>>n>>W;
for(int i=1;i<=n;i++){
cin>>a>>b>>c;
//二进制优化,转化为01背包
for(int j=1;j<=c;j<<=1){
value[++cnt]=j*a;
weight[cnt]=j*b;
c-=j;
}
if(c){
value[++cnt]=c*a;
weight[cnt]=c*b;
}
}
//状态转移(带入01背包的模板)
for(int i=1;i<=cnt;i++){
for(int j=W;j>=weight[i];j--){
dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);
}
}
cout<<dp[W];
return 0;
}