AcWing 7. 混合背包问题
原题链接
中等
作者:
戾儿
,
2021-04-02 17:09:58
,
所有人可见
,
阅读 336
(转换为01背包)
C++ 代码
#include <bits/stdc++.h>
using namespace std;
int n,m;
const int N=1111100;
int v[N],w[N],f[N];
int cnt;
int main()
{
cin>>n>>m;
while(n--)
{
int a,b,s;
cin>>a>>b>>s;//把所有背包全部转换成01背包
if(s<0) s=1;//01背包
else if(s==0) s=m/a;//完全背包的件数最多为总体积除于单件体积
int k=1;
while(k<=s)
{
v[++cnt]=a*k;w[cnt]=b*k;
s-=k;
k*=2;
}
if(s>0)
{
v[++cnt]=a*s;
w[cnt]=b*s;
}
}
for(int i=1;i<=cnt;i++)
{
for(int j=m;j>=v[i];j--)
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m]<<endl;
return 0;
}