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),因为我们需要存储每个工作的劳务费用和工作分配方案。

相关推荐
wanzehongsheng14 分钟前
基于天文算法的双轴太阳能追踪系统:从原理到工程实现
算法
誰能久伴不乏14 分钟前
ibmodbus “Invalid argument“ 错误的排查与修复
c++·qt·modbus
basketball61616 分钟前
Kadane算法 C++实现
java·c++·算法
handler0116 分钟前
【C++】二叉搜索树详解及其模拟实现(代码)
开发语言·c++·算法·c··二叉搜索树·搜索树
luj_176819 分钟前
残熵算法的稳健防灾逻辑
c语言·开发语言·c++·经验分享·算法
玖釉-19 分钟前
二叉树基础详解:TreeNode、buildTree、deleteTree 与 printTree 的实现原理(C++)
c++·windows·算法
Severus_black20 分钟前
【初阶数据结构与算法】八大排序之非比较排序(计数排序),一次性讲清!
数据结构·算法·排序算法
罗西的思考42 分钟前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (4)--- 系统架构
人工智能·算法·机器学习
QiLinkOS44 分钟前
从技术到资产的跃迁:企业专利布局的深层逻辑
c语言·数据结构·c++·单片机·嵌入式硬件·算法·开源
aini_lovee1 小时前
FMCW雷达测速测距系统(锯齿波 + CFAR检测)
算法