代码如下:
#include <iostream>
#include <vector>
#include <limits>
using namespace std;
const int INF = numeric_limits<int>::max();
int min_cost = INF;
void backtrack(const vector<vector<int>>& costs, vector<int>& assign, vector<bool>& used, int cur_cost, int cur_task) {
int n = costs.size();
// 如果所有任务都已经分配完毕,更新最小成本并返回
if (cur_task == n) {
min_cost = min(min_cost, cur_cost);
return;
}
// 枚举可供选择的人员,更新状态并继续回溯
for (int i = 0; i < n; i++) {
if (!used[i]) {
assign[cur_task] = i;
used[i] = true;
backtrack(costs, assign, used, cur_cost + costs[i][cur_task], cur_task + 1);
used[i] = false;
assign[cur_task] = -1;
}
}
}
int main() {
int n;
cin >> n;
vector<vector<int>> costs(n, vector<int>(n));
vector<int> assign(n, -1);
vector<bool> used(n, false);
// 读入任务成本
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> costs[i][j];
}
}
// 回溯求解
backtrack(costs, assign, used, 0, 0);
// 输出最小成本
cout << min_cost << endl;
return 0;
}
样例:
4
9 2 7 8
6 5 7 2
2 3 8 5
4 6 9 3
结果:
4
9 2 7 8
6 4 3 7
5 8 1 8
7 6 9 4
结果:
如有错误请指正,谢谢。
文章评论