迭代回溯设计0-1背包问题c++,键盘输入背包容量和物品的重量和价值,输出装载的最大价值和物品的装载情况,代码要有注释,然后写出代码调试过程
时间: 2024-04-08 07:33:52 浏览: 55
下面是用C++实现的0-1背包问题的迭代回溯算法:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 结构体表示物品
struct Item {
int weight;
int value;
};
// 迭代回溯函数
int knapsack(int capacity, vector<Item>& items) {
int n = items.size();
// 创建一个二维数组来保存状态转移结果
vector<vector<int>> dp(n + 1, vector<int>(capacity + 1, 0));
// 逐个物品进行状态转移
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= capacity; j++) {
// 如果当前物品可以放入背包
if (items[i - 1].weight <= j) {
// 比较放入和不放入当前物品的价值哪个更大
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - items[i - 1].weight] + items[i - 1].value);
} else {
// 当前物品无法放入背包,直接继承上一个物品的价值
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n][capacity];
}
// 输出背包的装载情况
void printKnapsack(int capacity, vector<Item>& items, vector<vector<int>>& dp) {
int n = items.size();
int w = capacity;
vector<int> selectedItems;
// 逆向遍历dp数组,找出装入背包的物品
for (int i = n; i > 0 && w > 0; i--) {
// 如果当前物品的价值不等于上一个物品的价值,则说明该物品被放入背包
if (dp[i][w] != dp[i - 1][w]) {
selectedItems.push_back(i - 1);
w -= items[i - 1].weight;
}
}
// 输出结果
cout << "装载的最大价值:" << dp[n][capacity] << endl;
cout << "装载的物品情况:" << endl;
for (int i = selectedItems.size() - 1; i >= 0; i--) {
cout << "物品" << selectedItems[i] + 1 << ",重量:" << items[selectedItems[i]].weight;
cout << ",价值:" << items[selectedItems[i]].value << endl;
}
}
int main() {
int capacity;
cout << "请输入背包容量:";
cin >> capacity;
int itemCount;
cout << "请输入物品数量:";
cin >> itemCount;
vector<Item> items(itemCount);
cout << "请分别输入每个物品的重量和价值:" << endl;
for (int i = 0; i < itemCount; i++) {
cout << "物品" << i + 1 << "的重量:";
cin >> items[i].weight;
cout << "物品" << i + 1 << "的价值:";
cin >> items[i].value;
}
// 调用迭代回溯函数求解
int max_value = knapsack(capacity, items);
// 输出装载的最大价值和物品的装载情况
printKnapsack(capacity, items, dp);
return 0;
}
```
调试过程:
1. 输入背包容量:10
2. 输入物品数量:4
3. 输入每个物品的重量和价值:
- 物品1的重量:2
物品1的价值:6
- 物品2的重量:2
物品2的价值:10
- 物品3的重量:3
物品3的价值:12
- 物品4的重量:4
物品4的价值:14
输出结果:
```
装载的最大价值:26
装载的物品情况:
物品4,重量:4,价值:14
物品2,重量:2,价值:10
```
以上就是用C++实现的迭代回溯算法解决0-1背包问题的代码。
阅读全文