欢迎使用CSDN-markdown编辑器

01背包
以上是01背包和完全背包的分析,具体是正序还是倒序,我们可以这样分析:
首先,二维数组是一个平面,面积为数组的大小;
那么一维数组就是一条线;
我们简单地认为一维数组是一个只有一列的表,而它的长度为数组的大小;
显然二维数组想调用上一阶段的数据的话,直接从上一列找即可,十分方便。
但是有一个问题:二维数组能开多大?
显然二维数组不能开很大。
如果我们只想要最后一个状态的话,那么只用一列表记录它们的值就好了,不需要存之前的值。
所以我们还是尽可能地压缩一下吧。
但是问题依然存在:在一维数组中你怎么找上一阶段的数据?
显然刚走到第i个阶段时(还没有开始到第一个状态),在一维数组中我们存的当然是第(i-1)阶段的数据,
假设我们正序走啊走。
先走第i个阶段的第1个状态。(假设该阶段有2k个状态)
假设:我们要使用第(i-1)个阶段的第(k+1)个状态。
那么我们的第一个状态就变成了第(k+1)个状态+决策执行。
看样子没什么问题。
好的我们走第2个状态。
那么我们要使用第(i-1)个阶段的第(k+2)个状态。
所以我们的第2个状态就变成了第(k+2)个状态+决策执行。
然后我们走第2k个状态。
等等……我们没有剩下的状态可以用了啊……
说好的要用第(i-1)个阶段呢?
看来正序不太靠谱……
试试逆序?
先走第i个阶段的第(2k)个状态。(假设该阶段有2k个状态)
假设:我们要使用第(i-1)个阶段的第(k+1)个状态。
然后我们的第2k个状态变成了第(k+1)个状态+决策执行。
然后走(2k-1)个状态吧。
然后我们的第(2k-1)个状态变成了第(k+1)个状态+决策执行。
然后……然后想走第1个状态没错吧。
但是也没有状态可以用了。
看样子都不太靠谱。
但是别忘了例题中01背包的状态转移方程:
f【j】=max(f【j-c【i】】+w【i】,f【j】);
这有什么稀奇的?
别忘了它是有限制条件的:
当j>=c【i】时我们才可以使用上一次的状态(要不然j

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值