#include<bits/stdc++.h>
using namespace std;
const int N = 1314;
int n, m;
int f[N];
int main()
{
cin>>n>>m;
for(int i = 0; i < n; i ++ ){
int v, w, s;
cin>>v>>w>>s;
if(!s){//完全背包
for(int j = v; j <= m; j ++ ) f[j] = max(f[j], f[j - v] + w);
}
else{
if(s == -1) s = 1;
for(int k = 1; k <= s; k *= 2){//多重背包的二进制优化,将s拆分为2^k+余数
for(int j = m; j >= k * v; j -- ){
f[j] = max(f[j], f[j - k * v] + k * w);
}
s -= k;
}
if(s){
for(int j = m; j >= s * v; j -- ){
f[j] = max(f[j], f[j - s * v] + s * w);
}
}
}
}
cout<<f[m]<<endl;
return 0;
}
AcWing 7 混合背包问题 题解 (动态规划—DP—背包问题)
最新推荐文章于 2022-07-08 16:37:42 发布