一、背包问题概述
Mermaid · 渲染中(下方为源码)
graph LR A[背包] --> B[01背包] A --> C[完全背包] A --> D[多重背包] B --> E[逆序枚举] C --> F[正序枚举]
背包问题是动态规划中最经典的模型族,面试中出现频率极高。核心形式:
有 n 个物品和一个容量为 W 的背包,每个物品有重量 w[i] 和价值 v[i],如何选择物品使总价值最大?
| 类型 | 每个物品可选次数 | 典型题 |
|---|---|---|
| 0/1 背包 | 0 或 1 | 分割等和子集 |
| 完全背包 | 无限次 | 零钱兑换 |
| 多重背包 | 有限次 | 限定数量的组合 |
| 分组背包 | 每组选一个 | 课程选择 |
二、0/1 背包
2.1 状态定义
dp[i][j] = 考虑前 i 个物品、背包容量为 j 时的最大价值。
2.2 转移方程
dp[i][j] = max(
dp[i-1][j], // 不选第 i 个
dp[i-1][j-w[i]] + v[i] // 选第 i 个(前提:j >= w[i])
)