完全背包问题 非零基础

目录

 之前学过一遍,但是12月2日再练忘光光了: 

忘记点1 —— 为什么每个物品要遍历k件:

忘记点2 —— 数学优化:

其实直接逻辑上想也可以


 之前学过一遍,但是12月2日再练忘光光了: 

95b2ddf4e571452db7ee6320d200e024.png

【模板】完全背包_牛客题霸_牛客网 (nowcoder.com)

3abe8566db7f4a8d9659db1ebf63a690.png

3. 完全背包问题 - AcWing题库

忘记点1 —— 为什么每个物品要遍历k件:

(这个属于逻辑没想清楚了,动态规划的“延伸遍历”逻辑)

        买k件和买3件4件会对应之前不同的体积那就会对应不同的价格,所以遍历件数比大小是有必要的

8bdadae9850a4e3e984874fdac1a8669.png

7ace9c248634483d946b104ce2708038.png

但还是超时了😭,所以得优化

忘记点2 —— 数学优化:

2776eaefd5604b84871d60f4172f88b4.png

下面这个细一点

3771859215a6476a8c19bc33ecdf4b8c.png

dp[i][j] 和 dp[i][ j-v[i] ] 最后一项都是体积无限逼近于0的

下面划线部分都加个w[i]就等价于上面那部分,所以计算上面那部分的时候没必要再遍历一遍了(这个就类似于“记忆化”,也正是优化了)

其实直接逻辑上想也可以

每件物品可以选无数次,那么dp[ i ][ j ] 就可以是 dp[ i ][ j - v[ i ] ] + w[ i ]。即基于上一次入背包来入背包。

“(注意滚动数组的话,它看的是j-v[i],所以要从前往后)”

所以滚动数组是正序的也好理解了。

有了式子应该就会了吧😚

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值