Skip to content

Latest commit

 

History

History
81 lines (48 loc) · 2.41 KB

File metadata and controls

81 lines (48 loc) · 2.41 KB

LintCode_125 backpack II

背包型动态规划

B站课程九章算法——DP5_9C(1)

题意

  • 给定N个物品,重量分别为正整数A0,A1....An-1,价值分别为正整数V0,V1....Vn-1

  • 一个背包最大承重是正整数M

  • 问最多能带走多大价值的物品

示例

  • 输入:4个物品、重量为2、3、5、7,价值为1、5、2、4.背包最大承重是11

  • 输出:9(取物品1、3,重量3+7=10,价值5+4 =9)


解题思路

背包问题的状态一定要把总承重放进去 每个装物品的方案总重量都是0-M

如果对于每个总重量,我们能知道对应的最大价值是多少,就能知道答案

  1. 确定状态

    需要知道N个物品

    • 能否拼出重量W(W=0,1,...M)
    • 对每个重量W的最大总价值是多少?
    • ==最后一步==:最后一个物品(重量An-1,价值Vn-1)是否进入背包?

      	 选择一最后一个物品不进入如果前N-1个物品能拼出W最大总价值是V那么前N个物品就也能拼出W并且最大总价值是V
          选择二最后一个物品进入背包如果前N-1个物品能拼出W-An-1,最大总价是V则再加上最后一个物品(重量An-1价值Vn-1),能拼出W最大总价是V+Vn-1
    • ==子问题==:要求前N个物品能不能拼出重量0,1,...M,以及拼出重量W能获得的最大价值。需要知道前N-1个物品能不能拼出重量0,1....M,以及评出重量W能获得的最大价值

    • ==状态==: $$ f[i][w]=用前i个物品拼出重量w时最大总价值(-1表示不能拼出w) $$

  2. 转移方程

    $$ f[i][w] = max{f[i-1][w],f[i-1][w-A_{i-1}]+V_{i-1}|w>A_{i-1} 且f[i-1][w-A_{i-1}]\neq-1} $$

  3. 初始条件和边界情况

    • 初始条件
      • f[0][0]= 0:0个物品可以拼出重量0,最大总价值是0
      • f[0][1..M] = -1:0个物品不能拼出大于0的重量
    • 边界情况
      • f[i-1][w-$A_{i-1}$] 只能在w$\geq A_{i-1}$,并且$f[i-1][w-A_{i-1}]\neq-1$时使用
  4. 计算顺序

    • 初始化 f[0][0],f[0][1],....f[0][M]
    • 计算前1个物品拼出各种重量的最大价值:f[1][0],f[1][1],...f[1][M]
    • 答案:$\max \limits_{0\leq j \leq M} {f[N][j] \mid f[N][j] \neq -1 }$

http://image.hw3static.com/hi/staticimages/hi3msg/images/2018/0524/10/5b0622ec4a479.jpg