多重背包的二进制优化模板

我们都知道多重背包可以转化为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


你可能感兴趣的:(模板)