给出01背包问题c++代码
时间: 2024-12-25 21:13:32 浏览: 7
01背包问题是一个经典的动态规划问题,用于解决物品分配问题,其中每个物品有一个重量和一个价值,目标是在不超过背包容量的情况下选择物品,以最大化总价值。以下是使用C++实现的一个基本版本:
```cpp
#include <iostream>
#include <vector>
int knapsack(int W, std::vector<int>& wt, std::vector<int>& val, int n) {
// 创建一个二维数组 dp[n+1][W+1],初始化所有值为0
std::vector<std::vector<int>> dp(n + 1, std::vector<int>(W + 1, 0));
// 动态规划循环
for (int i = 1; i <= n; ++i) {
for (int w = 1; w <= W; ++w) {
if (wt[i - 1] <= w) { // 如果当前物品可以放入背包
dp[i][w] = std::max(dp[i - 1][w], dp[i - 1][w - wt[i - 1]] + val[i - 1]); // 取两者的最大值:包含与不包含当前物品
} else { // 当前物品太大,无法装入背包
dp[i][w] = dp[i - 1][w];
}
}
}
return dp[n][W]; // 返回背包的最大价值
}
int main() {
int W = 50; // 背包容量
std::vector<int> wt = {10, 20, 30}; // 物品重量
std::vector<int> val = {60, 100, 120}; // 物品价值
int n = wt.size(); // 物品种类数
int max_value = knapsack(W, wt, val, n);
std::cout << "背包能装下的最大价值是: " << max_value << std::endl;
return 0;
}
```
阅读全文