C++利用回溯法的递归框架,实现 01 背包问题,(问题设定:背包的限定重 量为 6,物品数量为 4,四个物品的重量分别为 5,3,2,1;四个物品的价值分别为 4,4,3,1。)代码
时间: 2024-03-21 07:44:14 浏览: 82
C++使用回溯法解决01背包问题(含算法原理和代码)
好的,以下是C++利用回溯法的递归框架实现01背包问题的代码:
```c++
#include <iostream>
using namespace std;
const int MAXN = 4; // 物品数量
const int MAXW = 6; // 背包限定重量
int w[MAXN] = {5, 3, 2, 1}; // 物品重量数组
int v[MAXN] = {4, 4, 3, 1}; // 物品价值数组
int ans = 0; // 最大价值
void dfs(int idx, int tw, int tv) {
if (idx == MAXN) { // 所有物品都考虑完毕
if (tw <= MAXW && tv > ans) { // 满足背包容量限制,更新最大价值
ans = tv;
}
return;
}
dfs(idx + 1, tw, tv); // 不选择当前物品
dfs(idx + 1, tw + w[idx], tv + v[idx]); // 选择当前物品
}
int main() {
dfs(0, 0, 0);
cout << ans << endl;
return 0;
}
```
该算法的思路是:对于每个物品,可以选择将其放入背包或不放入背包,因此可以使用回溯法的递归框架,对每个物品进行考虑,直到所有物品都考虑完毕。在搜索过程中,需要维护当前已经放入背包的物品的重量总和tw和价值总和tv,如果在考虑完所有物品后,背包的重量总和tw不超过限定重量MAXW,且当前价值总和tv大于最大价值ans,则更新最大价值ans。
希望能够帮到你!
阅读全文