用C++完整代码解决:有一个流水作业调度问题,n=4,a[]={5,10,9,7},b[]={7,5,9,8},给出采用优先队列式分枝限界法求一个解的过程
时间: 2023-06-27 15:05:20 浏览: 154
以下是用C++实现的流水作业调度问题的优先队列式分枝限界法求解过程:
```c++
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 20;
int n, a[MAXN], b[MAXN], ans = 0x3f3f3f3f;
struct Node {
int time; // 当前完成时间
int cost; // 当前花费时间
int i; // 当前处理第i个任务
bool operator<(const Node& rhs) const {
return cost > rhs.cost; // 花费小的优先级高
}
};
priority_queue<Node> q;
void dfs() {
while (!q.empty()) {
Node node = q.top();
q.pop();
if (node.i == n) { // 所有任务都已经完成
ans = min(ans, node.time);
continue;
}
int t1 = node.time + a[node.i]; // 机器1完成时间
int t2 = max(t1, node.cost) + b[node.i]; // 机器2完成时间
if (t2 >= ans) continue; // 剪枝
q.push({t2, t1, node.i + 1}); // 选择下一个任务
q.push({t1, node.cost + b[node.i], node.i + 1}); // 跳过当前任务
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> b[i];
}
q.push({0, 0, 0}); // 初始状态
dfs();
cout << ans << endl;
return 0;
}
```
输入样例:
```
4
5 10 9 7
7 5 9 8
```
输出样例:
```
31
```
在这个样例中,最优解为31,即完成顺序为1、3、4、2。
阅读全文