完全背包问题状态转移方程解释

这几天一直在看背包问题,看了很久才看懂完全背包问题O(VN)的算法的原理,在此记录,防止以后忘记
这是我在看了背包九讲后总结的一种思路


完全背包问题有基本思路和改进后的O(VN)算法,这两个的状态转移方程基本都会出现在所有相关博客中

基本思路

类似于0-1背包问题,用f[i][v]表示前i种物品放入一个容量为v的背包的最大价值
状态转移方程:

f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<= v}

这应该容易理解,是在0-1背包问题的基础上得来的

O(VN)算法

f[v]来表示把N种物品放入容量为v的背包所得的最大价值

伪代码如下:

for v = 0 ... V do f[v] = 0
for i = 1 ... N do
	for v = c[i] ... V do
		f[v] = max{f[v], f[v-c[i]] + w[i]}

一种思路

这个算法可以由前面的基本思路优化而来。
首先,基本思路的状态转移方程可以优化为:

f[i][v]=max{f[i-1][v], f[i][v - c[i]] + w[i]}

这是因为f[i][v - c[i]] + w[i] = max{f[i-1][v - c[i] - k*c[i]] + k*w[i]} | 0 <= k*c[i] <= v-c[i]
这可以由基本思路的状态转移方程得来。

有了这个式子后,就容易得出O(VN)算法了,只需把空间优化成一维即可。
另外,由于算出f[i][v]用到了第i行的值,即已被更新后的值,因此内循环要从c[i]开始遍历到V,与0-1背包问题顺序正好相反

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值