c++实现给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
时间: 2023-10-03 10:02:42 浏览: 92
这是一个经典的动态规划问题,可以使用 0/1 背包算法来解决。具体步骤如下:
1. 定义一个二维数组 dp[i][j],表示前 i 个物品放入容量为 j 的背包中所能获得的最大价值。
2. 初始化 dp[0][j] = 0,dp[i][0] = 0。
3. 对于任意一个物品 i,有两种情况:
- 如果物品 i 的重量大于背包的容量 j,则不能将物品 i 放入背包中,此时最大价值为 dp[i-1][j]。
- 如果物品 i 的重量小于等于背包的容量 j,则可以选择将物品 i 放入背包中,此时最大价值为 dp[i-1][j-wi] + vi 和 dp[i-1][j] 中的较大值。
4. 最终的结果即为 dp[n][C]。
下面是 C++ 的实现代码:
```
#include <iostream>
#include <vector>
using namespace std;
int knapsack(int C, vector<int> &w, vector<int> &v) {
int n = w.size();
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 (w[i-1] > j) {
dp[i][j] = dp[i-1][j];
} else {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1]);
}
}
}
return dp[n][C];
}
int main() {
int C = 10;
vector<int> w = {2, 3, 4, 5};
vector<int> v = {3, 4, 5, 6};
int res = knapsack(C, w, v);
cout << "The maximum value is " << res << endl;
return 0;
}
```