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

我们都知道多重背包可以转化为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);
}
//多重背包的二进制优化


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值