01背包的空间优化

在裸01背包中 状态转移方程为 f[i][v]=max{f[i-1][v] , f[i-1][v-c[i]]+w[i]};
其空间复杂度为O(N*V)很多时候往往会导致堆空间不够,离散化数据来处理这个问题也不方便。
故而若我们能保证 第i次循环结束后f[v]中表示的就是我们定义的状态f[i][v]呢,即在 第次循环时 f[v]=f[i][v]
又由于f[i][v]是由f[i-1][v]和f[i-1][v-c[i]]两个子问题递推而来,故而在推f[i][v]时(也即在第i次主循环中推f[v]时)要能够得到f[i-1][v]和f[i-1][v-c[i]]的值
这要求在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c[i]]保存的是状态f[i-1][v-c[i]]的值,即每次进入第二层循环时,被子问题f[v-c[i]]与f[v]都保存的是上个循环即i=i-1时候的值
故而又有f[i][v]=max{f[i-1][v] , f[i-1][v-c[i]]+w[i]};
//伪代码
for i=1..N
for v=V..0 
f[v]=max{f[v],f[v-c[i]]+w[i]};
//巧妙的将第二场循环逆过来 似的子问题是最近一次的解
将二维数组的空间变为一维,解决了MLE的问题

顺带一提 若正过来 是无限背包的情况 可以参考下一篇题解


 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值