各种背包问题

背包问题

1. 01背包

最基本的背包问题就是01背包问题(01 knapsack problem):一共有 N N N件物品,第 i i i件物品的重量为 w [ i ] w[i] w[i],价值为 v [ i ] v[i] v[i]。在总重量不超过背包承载上限 W W W的情况下,能够装入背包的最大价值是多少(每件物品只有一个)?
d p [ i ] dp[i] dp[i]表示当背包容量为 i i i时能够装入背包的最大价值

for(int i=1;i<=n;i++) 
	for(int j=W;j>=w[i];j--) 
		dp[j]=max(dp[j-w[i]]+val[i], dp[j]);

2. 完全背包

完全背包(unbounded knapsack problem)与01背包不同就是每种物品可以有无限多个:一共有 N N N种物品,每种物品有无限多个,第 i i i种物品的重量为 w [ i ] w[i] w[i],价值为 v [ i ] v[i] v[i]。在总重量不超过背包承载上限 W W W的情况下,能够装入背包的最大价值是多少?

for(int i=1;i<=n;i++) 
	for(int j=w[i];j<=W;j++) 
		dp[j]=max(dp[j-w[i]]+val[i], dp[j]);

3. 恰好装满

背包问题有时候还有一个限制就是必须恰好装满背包,此时基本思路没有区别,只是在初始化的时候有所不同。
如果没有恰好装满背包的限制,我们将dp全部初始化成0就可以了。因为任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0了。如果有恰好装满的限制,那只应该将dp[0,…,N][0]初始为0,其它dp值均初始化为-inf,因为此时只有容量为0的背包可以在什么也不装情况下被“恰好装满”,其它容量的背包初始均没有合法的解,应该被初始化为-inf。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值