分配甲、乙、丙、丁四人去完成五项任务,每人完成各项任务的时间如下表所示

分配甲、乙、丙、丁四人去完成五项任务,每人完成各项任务的时间如下表所示。由于任务数多于人数,故规定其中有一个人可完成两项任务,其余三人每人只完成一项任务。试确定总花费时间最少的分配任务方案。(只建立模型,不必求解)

人员\任务 A B C D E
9 2 4 15 9
6 5 12 4 2
11 7 13 4 17
19 11 15 8 9
#include <bits/stdc++.h>

#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
int a[10][10];
bool v[10];
struct sta {
    int sum, two;
    pii c;
    vector<pii > one;
};
vector<sta> sch;

inline void per(int x) {
    switch (x) {
        case 1:
            printf("甲");
            break;
        case 2:
            printf("乙");
            break;
        case 3:
            printf("丙");
            break;
        default:
            printf("丁");
    }
}

void dfs(int u, sta now) {
    if (u == 5) {
        if (!sch.empty() && sch.back().sum > now.sum)sch.clear();
        if (sch.empty() || sch.back().sum == now.sum)
            sch.push_back(now);
        return;
    }
    if (!sch.empty() && sch.back().sum < now.sum)return;
    vector<int> c;
    for (int i = 1; i <= 5; i++)if (!v[i])c.push_back(i);
    if (u == 4 && c.size() == 2) {
        v[c[0]] = true, v[c[1]] = true;
        sta nex = now;
        nex.two = u;
        nex.sum += a[u][c[0]] + a[u][c[1]];
        nex.c = make_pair(c[0], c[1]);
        dfs(u + 1, nex);
        v[c[0]] = false, v[c[1]] = false;
        return;
    }
    for (int i = 0; i < c.size(); i++) {
        sta nex = now;
        nex.sum += a[u][c[i]];
        nex.one.emplace_back(u, c[i]);
        v[c[i]] = true;
        dfs(u + 1, nex);
        v[c[i]] = false;
    }
    for (int i = 0; i < c.size(); i++)
        for (int j = i + 1; j < c.size(); j++) {
            v[c[i]] = true, v[c[j]] = true;
            sta nex = now;
            nex.two = u;
            nex.sum += a[u][c[i]] + a[u][c[j]];
            nex.c = make_pair(c[i], c[j]);
            dfs(u + 1, nex);
            v[c[i]] = false, v[c[j]] = false;
        }
}

int main() {
    for (int i = 1; i <= 4; i++)
        for (int j = 1; j <= 5; j++)
            scanf("%d", &a[i][j]);
    sta now = {0, 0, {0, 0}, {}};
    dfs(1, now);
    printf("总最小花费时间为:%d\n", sch.back().sum);
    for (int i = 0; i < sch.size(); i++) {
        cout << "方案" << i + 1 << ":" << endl;
        per(sch[i].two);
        cout << "完成任务:" << (char) ('A' + sch[i].c.fi - 1) << "和"
             << (char) ('A' + sch[i].c.se - 1) << endl;
        for (int j = 0; j < sch[i].one.size(); j++) {
            per(sch[i].one[j].fi);
            cout << "完成任务:" << (char) ('A' + sch[i].one[j].se - 1) << endl;
        }
        puts("");
    }
    return 0;
}
/*
9 2 4 15 9
6 5 12 4 2
11 7 13 4 17
19 11 15 8 9
 */
总最小花费时间为:25
方案1:
甲完成任务:B和C
乙完成任务:A
丙完成任务:D
丁完成任务:E
发布了360 篇原创文章 · 获赞 28 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_45323960/article/details/105310258
今日推荐