01背包问题穷举法c++
时间: 2024-10-28 17:00:55 浏览: 29
C++背包问题穷举回溯备忘录动态规划.zip
01背包问题是一种经典的动态规划问题,其中物品的重量和价值需要考虑是否全部装入背包。穷举法,也称为暴力枚举,是一种简单直观但效率较低的解法。在C++中,我们可以按照以下步骤实现:
1. 定义一个二维数组`dp`,其大小为`(n+1) * (W+1)`,其中`n`是物品的数量,`W`是背包的最大容量。`dp[i][j]`表示前i件物品总重量不超过j时的最大价值。
2. 遍历所有物品(i = 1 到 n):
a. 对于每件物品,有两種选择:要么不放入背包,`dp[i][j] = dp[i-1][j]`;要么放入背包,此时价值为当前物品的价值加上不包含它的最大价值,即`dp[i-1][j-w_i] + v_i`,其中`w_i`是物品i的重量,`v_i`是物品i的价值。
3. 比较两个选择,取较大值作为新的`dp[i][j]`。
4. 最终,`dp[n][W]`就是所能获得的最大价值。
```cpp
#include <iostream>
using namespace std;
int knapsack(int W, int wt[], int val[], int n) {
int dp[n+1][W+1];
for (int i = 0; i <= n; i++) {
for (int w = 0; w <= W; w++) {
if (i == 0 || w == 0)
dp[i][w] = 0;
else 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[0]);
cout << "最大价值: " << knapsack(W, wt, val, n);
return 0;
}
```
阅读全文