我需要一个01背包c++的代码
时间: 2024-04-29 18:21:51 浏览: 58
以下是一个01背包问题的C++代码,希望对你有所帮助:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N][N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
for (int i = 1; i <= n; i ++ )
for (int j = 0; j <= m; j ++ )
{
f[i][j] = f[i - 1][j];
if (j >= v[i]) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
}
cout << f[n][m] << endl;
return 0;
}
```
这个代码的时间复杂度为 $O(nm)$,其中 $n$ 是物品的数量,$m$ 是背包的容量。这个算法使用了动态规划的思想,具体来说,我们使用一个二维数组 $f$ 来保存状态,其中 $f[i][j]$ 表示前 $i$ 个物品,容量为 $j$ 时的最大价值。状态转移方程为:
$$f[i][j] = \max(f[i-1][j], f[i-1][j-v[i]]+w[i])$$
其中 $v_i$ 表示第 $i$ 个物品的体积,$w_i$ 表示第 $i$ 个物品的价值。
阅读全文