题目链接
今天是背包九讲的第四讲,混合背包问题。混合背包问题相当于前三讲的综合。
这道题的关键点在于01背包看成最多只能用1次的多重背包,然后再分别套用完全背包和多重背包的模板即可
全部代码为
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
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)
{
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];
}