编写一个C++程序实现:用递归回溯和迭代回溯设计0-1背包问题
时间: 2024-04-08 12:31:23 浏览: 70
0-1背包问题-递归算法 c语言实现
5星 · 资源好评率100%
下面是一个使用递归回溯和迭代回溯算法来解决0-1背包问题的C++程序示例:
```cpp
#include <iostream>
#include <vector>
using namespace std;
struct Item {
int weight;
int value;
};
int max(int a, int b) {
return (a > b) ? a : b;
}
// 递归回溯算法
int recursiveBacktracking(vector<Item> items, int capacity, int index) {
if (index < 0 || capacity == 0) {
return 0;
}
if (items[index].weight > capacity) {
return recursiveBacktracking(items, capacity, index - 1);
} else {
return max(recursiveBacktracking(items, capacity, index - 1),
items[index].value + recursiveBacktracking(items, capacity - items[index].weight, index - 1));
}
}
// 迭代回溯算法
int iterativeBacktracking(vector<Item> items, int capacity) {
int n = items.size();
vector<vector<int>> dp(n + 1, vector<int>(capacity + 1));
for (int i = 0; i <= n; i++) {
for (int w = 0; w <= capacity; w++) {
if (i == 0 || w == 0) {
dp[i][w] = 0;
} else if (items[i - 1].weight <= w) {
dp[i][w] = max(items[i - 1].value + dp[i - 1][w - items[i - 1].weight], dp[i - 1][w]);
} else {
dp[i][w] = dp[i - 1][w];
}
}
}
return dp[n][capacity];
}
int main() {
vector<Item> items = {{10, 60}, {20, 100}, {30, 120}};
int capacity = 50;
// 使用递归回溯算法求解
int max1 = recursiveBacktracking(items, capacity, items.size() - 1);
cout << "递归回溯算法求解结果: " << max1 << endl;
// 使用迭代回溯算法求解
int max2 = iterativeBacktracking(items, capacity);
cout << "迭代回溯算法求解结果: " << max2 << endl;
return 0;
}
```
在这个示例中,我们定义了一个`Item`结构体来表示每个物品的重量和价值。然后,我们实现了`max`函数来返回两个整数中较大的一个。
接下来,我们分别实现了递归回溯算法和迭代回溯算法来解决0-1背包问题。
在`main`函数中,我们创建了一个包含三个物品的向量,并设置背包容量为50。然后,我们分别使用递归回溯算法和迭代回溯算法来求解背包问题,并将结果输出到控制台。
你可以根据自己的需求修改物品向量和背包容量,运行程序以获取不同情况下的结果。
阅读全文