关于01背包空间优化的理解(二维数组转一维数组)

昨天学习了01背包,对于他的二维数组转一维数组不是很能够理解。
今天专门记录一下。

我们知道01背包的状态转移方程是
f[i][j]=max(f[i-1][j],f[i-1][j-v[i]+w[i])
其中i表示第i个物品,j表示第i个物品放上去时当前背包的体积。
故j-v[i]表示的是i-1状态时背包占用的体积。

那为什么一维数组的状态转移方程是
f[j]=max(f[j],f[j-v[i]+w[i]))(j从v到v[i])
呢?

里面的f[j]代表的是i状态下的体积是j,如何保证j-v[i]是i-1状态下的体积呢?
答案就是把j倒序,如果j是从最大体积到0的话,那么j-v[i]必定<j,即如果j-v[i]存在的话,必定不是i状态下的赋值。那么就是i-1状态下的赋值了f[j]=max(f[j],f[j-v[i]+w[i]))(j从v到v[i])。意思就是i-1状态下体积为j这个状态,赋值到i状态下令其体积也是j,在一维数组上的表现形式其实是一致的。

关于初值的理解:
如果我们想求体积是v的最大值,要赋值的只有f[0] = 0,其他的都是负无穷
如果想求解的是体积小于等于v的最大值,应该赋值f[i] = 0,其余为负无穷

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值