c++实现0/1背包问题
时间: 2024-08-16 07:08:16 浏览: 42
0/1背包问题的两种解法--存储优化的递归和自下而上的递归(迭代法)
在 C++ 中,0/1 背包问题是一个经典的动态规划问题。它用于解决资源分配问题,给定一组物品,每件物品都有一个重量和价值,目标是在不超过背包容量的情况下,选择一组物品使得总价值最大。以下是基本的动态规划解决方案:
```cpp
#include <iostream>
using namespace std;
int knapsack(int W, int wt[], int val[], int n) {
// 创建一个二维数组dp,其中dp[i][w]表示前i个物品在总重量不超过w时的最大价值
int dp[n + 1][W + 1];
// 初始化第一行和第一列
for (int i = 0; i <= n; i++) {
dp[i] = 0;
}
for (int w = 1; w <= W; w++) {
dp[w] = 0;
}
// 动态填充dp表
for (int i = 1; i <= n; i++) {
for (int w = 1; w <= W; w++) {
if (wt[i - 1] <= w) { // 如果当前物品能放入背包
dp[i][w] = max(val[i - 1] + dp[i - 1][w - wt[i - 1]], dp[i - 1][w]); // 选或不选
} else { // 当前物品太大,无法放入背包
dp[i][w] = dp[i - 1][w];
}
}
}
return dp[n][W]; // 返回背包最大价值
}
int main() {
int W = 50; // 背包容量
int wt[] = {10, 20, 30}; // 物品重量
int val[] = {60, 100, 120}; // 物品价值
int n = sizeof(wt) / sizeof(wt);
cout << "最大价值: " << knapsack(W, wt, val, n) << endl;
return 0;
}
```
阅读全文