Skip to content

01 背包问题

structure01 package

问题描述

一共有N件物品,第i(i从1开始)件物品的重量为w[i],价值为v[i]。在总重量不超过背包承载上限W的情况下,求能够装入背包的最大价值是多少?

假设有一个 5 件物品,背包总重量 6,每一件的重量与价值如下

text
5 6
5 10 3 6 3 // 价值v
2 5 1 4 3 // 重量w

横向背包可装总重量大小,纵向表示物品可选范围 0 ~ i, 单元格内为0 ~ i件物品的最大价值

0123456
00055555
1005551010
2035881013
3035881013
4035881013
5035881013

对于某一行某一列的物品 (i, j) 价值,最终判断是否可选的最大值 dp[i][j] = max(选择第 i 件物品的价值 , 不选第 i 件物品价值)

  • 不选第 i 件物品价值: 第 i - 1 件物品的最大价值 dp[i - 1][j]
  • 选择第 i 件物品的价值: 当前总重量 减去 第 i 件 物品后的重量可容纳的最大价值 dp[i - 1][j - w[i] ] + v[i]

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

01 完全背包

n 个物品 变为 n 类物品,每一类物品可以选择多个

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