背包问题模板

转载至此链接

int v,j;     //v:总容量 
int dp[Maxv];    //c:体积  w:价值   n:数量 
void zobag(int c,int w)//01背包 
{
	for(j=v;j>=c;j--)
	dp[j]=Max(dp[j],dp[j-c]+w);
}
void combag(int c,int w)//完全背包 
{
	for(j=c;j<=v;j++)
	dp[j]=Max(dp[j],dp[j-c]+w);
}
void multibag(int c,int w,int n)//多重背包 
{
	if(c*n>v)     //当物品的总容量大于背包的总容量时,相当于完全背包 
	combag(c,w);
	else   //转换为01背包,二进制思想优化(例:13可以分为 1(2^0)、2(2^1)、4(2^2)、6,因为1、2、4、6这四个数可以组合成1—13中的所有数字)  
	{
		int k=1;
		while(k<n)
		{
			zobag(c*k,w*k);
			n-=k;
			k*=2;
		}
		zobag(c*n,w*n);
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值