混合背包:包含着01背包,完全背包,多重背包
而这个题通过k[i]进行判断是哪个背包,少了个完全背包。
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1000;
int vp[N];
int vr[N];
int k[N];
int w[N];
int f[151][151];
int main()
{
int n,p,r;
cin>>n>>p>>r;
for(int i=1;i<=n;i++)
{
cin>>vp[i]>>vr[i]>>k[i]>>w[i];
}
f[0][0]=0;
for(int i=1;i<=n;i++)
{
//01背包
if(k[i]==1)
{
for(int j=p;j>=vp[i];j--)
{
for(int x=r;x>=vr[i];x--)
{
for(int u=0;u<=k[i];u++)
{
if(u*vp[i]<=j&&u*vr[i]<=x)
f[j][x]=max(f[j][x],f[j-vp[i]*u][x-vr[i]*u]+w[i]*u);
}
}
}
}
//多重背包
else if(k[i]==0)
{
for(int j=p;j>=vp[i];j--)
{
for(int x=r;x>=vr[i];x--)
{
for(int u=0;u<=1e5;u++)
{
if(u*vp[i]>j||u*vr[i]>x)
break;
f[j][x]=max(f[j][x],f[j-vp[i]*u][x-vr[i]*u]+w[i]*u);
}
}
}
}
//多重背包
else
{
for(int j=p;j>=vp[i];j--)
{
for(int x=r;x>=vr[i];x--)
{
for(int u=0;u<=k[i];u++)
{
if(u*vr[i]<=x&&u*vp[i]<=j)
f[j][x]=max(f[j][x],f[j-vp[i]*u][x-vr[i]*u]+w[i]*u);
}
}
}
}
}
cout<<f[p][r]<<endl;
return 0;
}