3、请用非递归的迭代回溯方式,重新实现装载问题的求解,给出C++代码
时间: 2023-11-02 11:04:53 浏览: 119
装载问题c++代码
以下是装载问题的非递归迭代回溯解法的C++代码:
```c++
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
const int maxn = 100;
int n, c, w[maxn];
struct State {
int i, cw;
State(int i = 0, int cw = 0):i(i),cw(cw) {}
};
bool operator<(const State& s1, const State& s2) {
return s1.cw < s2.cw;
}
int loading() {
sort(w, w + n); // 将物品按重量从小到大排序
stack<State> s;
int bestw = 0, i = 0, cw = 0; // bestw为最优解,i为当前物品编号,cw为当前载重量
while (true) { // 不断地往前推进
if (i == n) { // 处理完所有物品
if (cw > bestw) bestw = cw;
if (s.empty()) break;
State t = s.top();
s.pop();
i = t.i + 1;
cw = t.cw;
} else if (cw + w[i] <= c) { // 装入第i个物品
cw += w[i];
s.push(State(i, cw));
i++;
} else { // 不装第i个物品
i++;
}
}
return bestw;
}
int main() {
cin >> n >> c;
for (int i = 0; i < n; i++) {
cin >> w[i];
}
cout << loading() << endl;
return 0;
}
```
该算法使用了一个栈来保存回溯时需要恢复的状态,从而避免了递归调用。算法的时间复杂度为 $O(2^n)$。
阅读全文