本期博客我们来复习一下我们之前学过的三种背包:
内容 状态转移方程
0-1背包 每种物品我们可以选/不选 dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
完全背包 每种物品有无数件 dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
多重背包 每种物品s[i]件 dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i];
那么今天我们来看一下混合背包,应用一下。
混合背包是神马?混合背包就是以上三种背包的结合体。
还是输入w[i],v[i],s[i]
如果s[i]是1就是0-1背包
如果s[i]是0就是完全背包
如果s[i]是其他就是多重背包
很简单,代码如下:
#include <bits/stdc++.h>
using namespace std;
int w[maxn],v[maxn],s[maxn],dp[maxm];
int main(){
int n,m;
cin>>m>>m;
for(int i=1;i<=n;i++)
cin>>w[i]>>v[i]>>s[i];
for(int i=1;i<=n;i++){
if(s[i]==1){//0-1背包
for(int j=m;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
else if(s[i]==0){//完全背包
for(int j=w[i];j<=m;j++)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
else{//多重背包(朴素),转0-1背包
for(int j=m;j>=w[i];j--){
for(int k=1;k<s[i] && k*w[i]<=m;k++)
dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]);
}
}
}
cout<<dp[m]<<endl;
return 0;
}
现在只剩最后一种背包了:分组背包。
TA和0-1背包有点像,但又不太一样。
我将在下一期博客讲解它。