分支限界法处理装载问题,直接给c++代码
时间: 2023-10-29 11:09:23 浏览: 170
分支限界法解决装载问题
5星 · 资源好评率100%
好的,以下是使用分支限界法处理装载问题的C++代码:
```c++
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
int c, n, w[MAXN];
bool vis[MAXN];
struct Node {
int id;
int rest;
int cost;
bool operator < (const Node &rhs) const {
return cost > rhs.cost;
}
};
int dfs(int id, int rest) {
if(rest <= 0) return 0;
if(id == n + 1) return 0;
if(w[id] > rest) return dfs(id + 1, rest);
return max(dfs(id + 1, rest), dfs(id + 1, rest - w[id]) + 1);
}
int bfs() {
priority_queue<Node> q;
for(int i = 1; i <= n; i++) {
q.push({i, c - w[i], w[i]});
}
while(!q.empty()) {
Node cur = q.top();
q.pop();
if(cur.rest < 0) continue;
if(cur.id == n) return cur.cost;
vis[cur.id] = true;
q.push({cur.id + 1, cur.rest, cur.cost});
q.push({cur.id + 1, cur.rest - w[cur.id + 1], cur.cost + 1});
}
return 0;
}
int main() {
cin >> c >> n;
for(int i = 1; i <= n; i++) {
cin >> w[i];
}
int ans = dfs(1, c); // dfs 求解
cout << ans << endl;
// bfs 求解
cout << bfs() << endl;
return 0;
}
```
其中,dfs函数是使用深度优先搜索求解的方法,bfs函数则使用分支限界法求解,其中用到了一个优先队列来维护搜索状态。两种方法都能够求解出装载问题的最优解。
阅读全文