回溯法求解0/1背包问题c++代码生成
时间: 2023-07-03 07:22:54 浏览: 99
以下是使用回溯法求解0/1背包问题的C++代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_N = 100; // 物品的最大数量
int N; // 物品的数量
int W[MAX_N], V[MAX_N]; // 物品的重量和价值
int C; // 背包的容量
int max_value; // 最大价值
bool used[MAX_N]; // 记录背包中是否装入某个物品
// 回溯函数
void dfs(int i, int w, int v) {
if (i == N) { // 达到叶子节点
if (w <= C && v > max_value) { // 更新最大价值
max_value = v;
for (int j = 0; j < N; j++) {
used[j] = false;
if (w + W[j] <= C) { // 记录背包中装入的物品
used[j] = true;
}
}
}
return;
}
dfs(i+1, w, v); // 不装入第i个物品
dfs(i+1, w+W[i], v+V[i]); // 装入第i个物品
}
int main() {
cin >> N >> C;
for (int i = 0; i < N; i++) {
cin >> W[i] >> V[i];
}
memset(used, false, sizeof(used)); // 初始化
max_value = 0;
dfs(0, 0, 0); // 从第0个物品开始装
cout << "Max value: " << max_value << endl;
cout << "Items: ";
for (int i = 0; i < N; i++) {
if (used[i]) {
cout << i << " ";
}
}
cout << endl;
return 0;
}
```
该代码使用dfs函数进行回溯,枚举所有的物品装或不装的情况,并更新最大价值和记录背包中装入的物品。在主函数中,从标号为0的物品开始装,输出最大价值和装入的物品。
阅读全文