1. 背包问题概述
背包问题是动态规划领域最经典的问题类型之一,其核心思想可以概括为:在给定的容量限制下,从一组物品中选择最优的组合,以达到特定的目标(如最大化价值、最小化成本或计算可行方案数)。这类问题在实际应用中极为广泛,从资源分配到投资组合优化,都能看到它的身影。
1.1 背包问题的基本要素
每个背包问题都包含三个基本要素:
- 物品集合:每个物品通常具有重量(或体积)和价值两个属性
- 背包容量:对所选物品总重量的限制
- 选择规则:决定物品能否被重复选择以及选择的方式
1.2 背包问题的分类
根据物品选择规则的不同,背包问题主要分为以下几种类型:
- 01背包:每个物品最多只能选择一次(选或不选)
- 完全背包:每个物品可以被无限次选择
- 多重背包:每个物品有固定的选择次数限制
- 多维背包:背包有多个维度的限制条件(如重量和体积)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 01背包问题详解
01背包是最基础的背包问题类型,也是理解其他变种的基础。其典型描述是:给定一组物品,每个物品有一定的重量和价值,在背包容量限制下,如何选择物品使得总价值最大,且每个物品只能选择一次。
2.1 基本解法
2.1.1 状态定义
我们使用二维数组dp[i][j]表示状态,其中:
i表示考虑前i个物品j表示当前背包的容量dp[i][j]的值表示在前i个物品中选择,总重量不超过j时的最大价值
2.1.2 状态转移方程
对于每个物品,我们有两种选择:
- 不选当前物品:
dp[i][j] = dp[i-1][j] - 选择当前物品:
dp[i][j] = dp[i-1][j-w[i]] + v[i](前提是j ≥ w[i])
因此,状态转移方程为:
code复制dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
2..3 初始化
dp[0][j] = 0:考虑0个物品时,无论背包容量多大,价值都为0dp[i][0] = 0:背包容量为0时,无法装入任何物品,价值为0
2.2 空间优化
观察状态转移方程可以发现,当前状态只依赖于上一行
