动态规划求背包问题代码c++
时间: 2024-10-20 21:02:09 浏览: 35
动态规划求解背包问题通常是通过构建一个二维数组来存储子问题的最优解。对于0/1背包问题,我们有一个物品集合和一个容量限制,每种物品有一个价值和重量。代码通常会使用一个名为`dp`的二维数组,其中`dp[i][w]`表示在不超过总重量`w`的情况下,能够获取到的价值最大值。
以下是基本的0/1背包问题的C++代码示例:
```cpp
#include <iostream>
using namespace std;
int knapSack(int W, int wt[], int val[], int n) {
// 创建一个大小为(n+1)x(W+1)的二维数组
int dp[n + 1][W + 1];
// 初始化,如果背包为空或者没有任何物品,则价值为0
for (int i = 0; i <= n; i++) {
dp[i][0] = 0;
}
// 对于每个物品,考虑是否放入背包
for (int i = 1; i <= n; i++) {
for (int w = 1; w <= W; w++) {
// 如果当前物品的重量大于剩余背包容量,那么就不能选择这个物品
if (wt[i - 1] > w)
dp[i][w] = dp[i - 1][w];
else {
// 否则,选择放入(取值加上之前剩余空间的最大价值)和不选择(保持不变)
dp[i][w] = max(val[i - 1] + dp[i - 1][w - wt[i - 1]], dp[i - 1][w]);
}
}
}
return dp[n][W];
}
int main() {
int W = 50, wt[] = {10, 20, 30}, val[] = {60, 100, 120};
int n = sizeof(wt) / sizeof(wt[0]);
cout << "The maximum value that can be put in a bag of weight " << W << " is " << knapSack(W, wt, val, n);
return 0;
}
```
在这个代码中,`knapSack`函数返回给定背包容量下可以获得的最大价值。如果你有其他问题关于动态规划、背包问题或者其他编程相关的问题,请随时提问。
阅读全文