用C++写一个动态规划法求解背包0/1问题
时间: 2023-07-20 15:06:10 浏览: 54
好的,下面是用C++实现的动态规划法求解背包0/1问题的代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int knapsack(vector<int>& w, vector<int>& v, int W) {
int n = w.size();
vector<vector<int>> dp(n + 1, vector<int>(W + 1, 0));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= W; ++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][W];
}
int main() {
vector<int> w = {2, 3, 4, 5};
vector<int> v = {3, 4, 5, 6};
int W = 8;
int result = knapsack(w, v, W);
cout << "The maximum value of items in the knapsack is: " << result << endl;
return 0;
}
```
其中,`w`是物品的重量,`v`是物品的价值,`W`是背包的容量。`dp[i][j]`表示前i件物品放进容量为j的背包的最大价值。在每个状态中,我们可以选择将第i件物品放入背包中或不放入背包中。如果第i件物品放入背包中,则背包的容量减少w[i-1],价值增加v[i-1]。如果第i件物品不放入背包中,则背包的容量和价值都不变。
最后我们返回`dp[n][W]`,表示前n件物品放进容量为W的背包的最大价值。在本例中,输出结果为"The maximum value of items in the knapsack is: 9",表示在容量为8的背包中,将重量为2和重量为5的两件物品放入背包中,可以得到最大价值为9。