采用动态规划求解0/1背包问题用C++语言实现
时间: 2023-07-16 12:16:06 浏览: 111
下面是采用动态规划求解0/1背包问题的C++代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
int knapsack(vector<int>& w, vector<int>& v, int n, int c) {
// 初始化二维数组dp
vector<vector<int>> dp(n + 1, vector<int>(c + 1, 0));
// 动态规划求解
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= c; j++) {
if (j >= w[i - 1]) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
// 返回最优解
return dp[n][c];
}
int main() {
vector<int> w = {2, 2, 6, 5, 4};
vector<int> v = {6, 3, 5, 4, 6};
int n = w.size();
int c = 10;
cout << "最大价值为:" << knapsack(w, v, n, c) << endl;
return 0;
}
```
其中,`w`和`v`分别表示物品的重量和价值,`n`表示物品的数量,`c`表示背包的容量。动态规划求解的过程采用二维数组`dp`来存储每个子问题的最优解,`dp[i][j]`表示前`i`个物品在背包容量为`j`时的最大价值。最终返回`dp[n][c]`即为最优解。
阅读全文