算法 ||动态规划|| 背包dp

  dynamic program 俗称dp,本质是把经历过的用一个东西来标识出来。应用时,问题要满足三个条件:最优子结构,无后效性和子问题重叠。

需要找到状态转移方程,来解决每个子问题,并依次进行递推直到题目解答玩成。

-------------------------------------------------------------------------------------------------------------------------------

背包问题:有 n个物品和一个容量为V的背包,每个物品有体积wi和价值vi两种属性,要求选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容量。

 1、 0-1背包:一个物品只能选取一次。

二维dp:

        当可以选择物品的数量增加时,存在两种情况:

             装不下:则新加的可选物品数量对总价值没有影响,可以进入下一个递推。

此时方程:f[i][j]=f[i][j].

              装得下:存在选取新的物品后总价值反而比不用选取新物品时的情况要大(因为存在物品可能重量小,价值大)

故此时方程:f[i][j]=max(f[i-1][j],f[i-1][j-wi]+v[i])


一维dp:                                     dp[j]=max(dp[j],dp[j-w[i]]+v[i]

对于0-1背包,二维数组为什么是正序,一维数组却不能是正序:

二维数组有两层循环,(可以调换)假设第一个for是可选的物体个数,第二个for是背包容量,在可选物体个数的情况下,背包的容量是递增的。

        若只能装一个物品,且容量从0开始,能选择的第一个物品,肯定是容量最小的。当容量接着增加时,在这个循环中背包中的物品的总价值不会再变化,直观上,可能会认为当容量增加时,我就可以把这个背包里现有的物品换成价值更大的。但根据状态转移方程,背包里的物品不会被替换覆盖。因为不能再重新选取物品了,只能等到可选物品的数量+1再进行筛选。        

        当可选物品数量+1时,容量接着从0开始加,此时就有疑问:是重新挑选两个物品,还是在第一个物品已将挑选的情况下再挑个新的。dp[i][j]是全局变量,当可选物品为2时,容量遍历到j,此时dp的值就是可选物品为1的值,容量也被赋值成上一个被选择的那个。所以,相当于是去挑个新的,不去挑选已将被选中的那个。

而一维数组的dp【j】就是直观上的理解,j每+1,背包的物品就会大洗牌一次,根据一维dp的状态转移方程 如果正序选择,存在选了又选的情况,而倒序则不会存在该问题。

2、完全背包:一个物品可以选取无数次。

        0-1背包的进阶,可看成一个物品有无数个而非可以选取无数次。

同样存在选/不选的情况

    则状态转移方程为:

dp[i][j]=max(dp[i-1][j],dp[i][j-v[i]]+w[i])

多重背包: 指物品可选有限次。 思路与上述类似。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值