介绍一下01背包问题,包括时间复杂度 空间复杂度
时间: 2025-08-02 19:07:01 浏览: 13
### 01背包问题介绍
01背包问题是一种经典的组合优化问题,广泛应用于动态规划领域。该问题的基本描述是:给定一组物品,每个物品具有特定的重量和价值,目标是选择一部分物品放入一个容量有限的背包中,使得背包中物品的总价值最大化。在01背包问题中,每件物品只能选择一次(即选或不选),因此得名“01”背包。
具体来说,假设背包的最大容量为 $ V $,有 $ N $ 件物品,其中第 $ i $ 件物品的重量为 $ w[i] $,价值为 $ v[i] $。问题要求在不超过背包容量的前提下,选择物品使得总价值最大。
### 动态规划解法
01背包问题通常使用动态规划方法求解。定义一个二维数组 $ dp[i][j] $,表示从前 $ i $ 件物品中选择,且背包容量为 $ j $ 时所能获得的最大价值。动态规划的状态转移方程为:
$$
dp[i][j] = \max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
$$
其中,第一项表示不选第 $ i $ 件物品,第二项表示选第 $ i $ 件物品。
#### 时间复杂度分析
对于 $ N $ 件物品和容量为 $ V $ 的背包,朴素的动态规划解法需要遍历所有物品和所有可能的容量值,因此时间复杂度为 $ O(N \times V) $。这是因为每个状态 $ dp[i][j] $ 的计算需要一次比较操作,而总共有 $ N \times V $ 个状态。
#### 空间复杂度分析
朴素解法使用了一个二维数组 $ dp $,其大小为 $ N \times V $,因此空间复杂度为 $ O(N \times V) $。然而,通过优化,可以将空间复杂度降低到 $ O(V) $。
### 空间复杂度优化
空间优化的关键在于观察到计算 $ dp[i][j] $ 时,仅依赖于 $ dp[i-1][j] $ 和 $ dp[i-1][j-w[i]] $。这意味着可以使用一个一维数组 $ dp[j] $ 来替代二维数组。在每次处理第 $ i $ 件物品时,从后往前更新数组(即逆序遍历容量),以确保每个状态只被更新一次。
优化后的状态转移方程为:
$$
dp[j] = \max(dp[j], dp[j-w[i]] + v[i])
$$
由于每次更新都只使用当前的一维数组,并且逆序遍历保证了不会重复计算同一物品的多次选择,空间复杂度被优化为 $ O(V) $。
### 示例代码
以下是01背包问题的朴素解法和优化解法的代码示例:
#### 朴素解法(二维数组)
```cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int m, n;
int w[1200], c[1200], f[1200][300];
scanf("%d %d", &m, &n);
for (int i = 1; i <= n; i++) {
scanf("%d %d", w + i, c + i);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (j >= w[i]) {
f[i][j] = max(f[i-1][j-w[i]] + c[i], f[i-1][j]);
} else {
f[i][j] = f[i-1][j];
}
}
}
cout << f[n][m];
return 0;
}
```
#### 优化解法(一维数组)
```cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int m, n;
int w[1200], c[1200], dp[300] = {0};
scanf("%d %d", &m, &n);
for (int i = 1; i <= n; i++) {
scanf("%d %d", w + i, c + i);
}
for (int i = 1; i <= n; i++) {
for (int j = m; j >= w[i]; j--) {
dp[j] = max(dp[j], dp[j - w[i]] + c[i]);
}
}
cout << dp[m];
return 0;
}
```
### 总结
- **时间复杂度**:无论是朴素解法还是优化解法,时间复杂度均为 $ O(N \times V) $。
- **空间复杂度**:朴素解法的空间复杂度为 $ O(N \times V) $,而优化解法的空间复杂度为 $ O(V) $。
通过动态规划和空间优化,01背包问题能够在合理的时间和空间范围内得到有效解决。
阅读全文
相关推荐




















