我们都知道多重背包可以转化为01背包来做,最朴素的就是直接通过枚举个数来判断。
不过通过二进制优化,可以节省一些时间。
二进制是一个神奇的东西,应用到计算机里面有很多的妙用。
二进制优化的原理如下:
1、2、4可以组合出所有小于8的数;
1、2、4、8可以组合出所有小于16的数。
……
例如,一个数10,我可以分成1、2、4、3。这样就将原本的10个价值相同的物品转化为价值不同的4个物品了。
void zero(int cost,int weight)
{
for(int i=ave;i>=cost;i--)
dp[i]=max(dp[i],dp[i-cost]+weight);
}
void complet(int cost,int weight)
{
for(int i=cost;i<=ave;i++)
dp[i]=max(dp[i],dp[i-cost]+weight);
}
void multi(int cost ,int amount)
{
if(cost*amount>=ave)
{
complet(cost,weight);
return;
}
int k=1;
while(k<amount)
{
zero(k*cost,k*weight);
amount-=k;
k=k*2;
}
zero(amount*cost,amount*weight);
}
//多重背包的二进制优化