使用回溯法求0-1背包问题请用C++语言编程,最后返回最大价值和所选用的物品标号,代码中请加注释
时间: 2024-03-04 10:49:18 浏览: 61
算法分析回溯法实现0-1背包(c++)归类.pdf
好的,以下是使用回溯法求解0-1背包问题的C++代码,已加注释:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int n, m; // 物品数量和背包容量
int max_value = 0; // 最大价值
vector<int> max_items; // 所选用的物品标号
// 回溯函数
void backtrack(int i, int cur_weight, int cur_value, vector<int>& items, vector<int>& values) {
if (i == n) { // 已经考虑完所有物品
if (cur_value > max_value) { // 更新最大价值
max_value = cur_value;
max_items = items;
}
return;
}
if (cur_weight + values[i] <= m) { // 加入第i个物品
items.push_back(i);
backtrack(i + 1, cur_weight + values[i], cur_value + values[i], items, values);
items.pop_back(); // 恢复现场
}
backtrack(i + 1, cur_weight, cur_value, items, values); // 不加入第i个物品
}
int main() {
// 输入物品数量和背包容量
cin >> n >> m;
vector<int> values(n); // 每个物品的价值
for (int i = 0; i < n; i++) {
cin >> values[i];
}
vector<int> items; // 所选用的物品标号
backtrack(0, 0, 0, items, values);
// 输出最大价值和所选用的物品标号
cout << "Max value: " << max_value << endl;
cout << "Items: ";
for (int i = 0; i < max_items.size(); i++) {
cout << max_items[i] << " ";
}
cout << endl;
return 0;
}
```
使用方法:
输入格式:
```
物品数量 背包容量
每个物品的价值
```
例如:
```
5 10
6 3 5 4 6
```
输出结果:
```
Max value: 15
Items: 0 2 4
```
阅读全文