17085 工作分配问题(优先做)

这个问题可以通过回溯法来解决。我们可以遍历所有可能的工作分配方案,然后找出总劳务费用最小的方案。

以下是C++代码实现:

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int INF = 1e9;
const int MAXN = 15;
int n;
int cost[MAXN][MAXN];
int dp[1 << MAXN];
int path[MAXN], bestPath[MAXN];
int minCost = INF;

void dfs(int u, int state, int sum) {
    if (sum >= minCost) return; // 剪枝
    if (u == n) {
        minCost = sum;
        copy(path, path + n, bestPath);
        return;
    }
    for (int i = 0; i < n; i++) {
        if (!(state >> i & 1)) {
            path[u] = i + 1;
            dfs(u + 1, state | 1 << i, sum + cost[u][i]);
        }
    }
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> cost[i][j];
        }
    }
    dfs(0, 0, 0);
    cout << minCost << endl;
    for (int i = 0; i < n; i++) {
        cout << bestPath[i] << ' ';
    }
    return 0;
}

在这段代码中,我们首先读取输入的工作数n和每个工作的劳务费用。然后我们使用深度优先搜索遍历所有可能的工作分配方案。对于每个方案,我们计算总劳务费用,并更新最小总劳务费用和最佳工作分配方案。最后,我们输出最小总劳务费用和最佳工作分配方案。

这段代码的时间复杂度是O(n!),因为我们需要遍历所有可能的工作分配方案。这段代码的空间复杂度是O(n),因为我们需要存储每个工作的劳务费用和工作分配方案。

相关推荐
程序员zgh8 分钟前
C++ 互斥锁、读写锁、原子操作、条件变量
c语言·开发语言·jvm·c++
鲨莎分不晴19 分钟前
强化学习第五课 —— A2C & A3C:并行化是如何杀死经验回放
网络·算法·机器学习
搞科研的小刘选手1 小时前
【ISSN/ISBN双刊号】第三届电力电子与人工智能国际学术会议(PEAI 2026)
图像处理·人工智能·算法·电力电子·学术会议
拉姆哥的小屋1 小时前
从混沌到秩序:条件扩散模型在图像转换中的哲学与技术革命
人工智能·算法·机器学习
Sammyyyyy1 小时前
DeepSeek v3.2 正式发布,对标 GPT-5
开发语言·人工智能·gpt·算法·servbay
QQ 19226381 小时前
探索储能双向 DCDC 变换器:双向 Buck - Boost 电路仿真之旅
深度优先
sin_hielo2 小时前
leetcode 2110
数据结构·算法·leetcode
Jay20021112 小时前
【机器学习】33 强化学习 - 连续状态空间(DQN算法)
人工智能·算法·机器学习
panzer_maus2 小时前
归并排序的简单介绍
java·数据结构·算法
獭.獭.2 小时前
C++ -- STL【unordered_set和unordered_map的使用】
c++·stl·unordered_map·unordered_set