混合背包
啥是混合背包呢,就是包含01背包,完全背包,多重背包。
有n件物品,背包承重最大为m,w[i]代表重量,v[i]代表价值,s[i]代表种类。
s[i]=-1,可用1次,s[i]=0,可用无限次,s[i]>0,可用s[i]次.
解法:见代码
const int maxn=1e4+5;
int n,m,dp[M+1],w[N*S],v[N*S],s[N*S];
int main()
{
cin>>n>>m;
int ant=0,x,y,z;
for(int i=1;i<=n;i++)
{
cin>>x>>y>>z;
if(z>1)//多重背包
{
for(int j=1;j<=z;j*=2)
{
w[++ant]=j*x;
v[ant]=j*y;
s[ant]=1;
z-=j;
}
if(z>0)
{
w[++ant]=z*x;
v[ant]=z*y;
s[ant]=1;
}
}
else
{
w[++ant]=x;
v[ant]=y;
s[ant]=z;
}
}
for(int i=1;i<=ant;i++)
{
if(s[i]==0)//完全背包
{
for(int j=w[i];j<=m;j++)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
else
{
for(int j=m;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
cout<<dp[m]<<endl;
return 0;
}
分组背包
分组背包感觉没啥好讲的,直接上板子吧,板子来源
#include<iostream>
#include<vector>
using namespace std;
#define N 105
int dp[N];
int v[N];
int w[N];
int main()
{
int n,m,s;
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>s;
for(int k=0;k<s;k++)
cin>>v[k]>>w[k];
for(int j=m;j>=0;j--)
for(int k=0;k<s;k++)
if(j>=v[k])
dp[j]=max(dp[j],dp[j-v[k]]+w[k]);
}
cout<<dp[m]<<endl;
return 0;
}