一:转化为二进制01背包
将背包的数量转化用2的平方转化:(将背包分堆)
元素:
k(每堆的个数)
s(物品的数量)--(01背包,s=1;完全背包,s=V/vi)
vi(存入每个堆的体积)
wi(存入每个堆的价值)
while(k<=s)
{
v[cnt]=a*k;
w[cnt]=b*k;
s-=k;
k*=2;
cnt++;
}
if(s>0)
{
v[cnt]=s*a;
w[cnt]=s*b;
cnt++;
}
二 :转化为01 背包之后,再用零一背包的一维简化模板
for(int i=1;i<=cnt;++)
{
for(int j=V;j>=v[i];j--)
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[V];