工作效率问题,1-n的全排列算法

本文探讨了如何通过求解全排列来优化人员的工作效率问题,提供了一个C++实现的具体算法示例,并附带详细解释及注意事项。

前言

	简单问题,写的不好,大佬见谅.
	如有疏漏,恳请指正,小编垂首.

问题描述:

工作效率问题
在这里插入图片描述

问题解析:

  1. 要遍历到每一种可能的安排
  2. 求j的全排列

实现代码:

代码如下(示例):

#include<cstdio>
#include<vector>
using namespace std;
int t[10][10];
int n;
vector<vector<int>> ps;//存放全排列

void Insert(vector<int> s,int i,vector<vector<int>> &ps1) {
    vector<int> s1;
    vector<int>::iterator it;
    for (int j = 0; j < i; j++) {       //每个位置插入一次
        s1 = s;                         
        it = s1.begin() + j;            //求出插入的位置
        s1.insert(it, i);               //插入i
        ps1.push_back(s1);              //添加到ps1中
    }
}


void Perm(int n) {          //求1-n的全排列
    vector<vector<int>> ps1;//定义全排列数组
    vector<vector<int>>::iterator it;//迭代器
    vector<int> s, s1;
    s.push_back(1);
    ps.push_back(s);
    for (int i = 2; i <= n; i++) {//依次插入i
        ps1.clear();    //清空
        for (it = ps.begin(); it != ps.end(); ++it) {   //每个不同的全排列都要插入i
            Insert(*it, i, ps1);
        }
        ps = ps1;
    }
}


void Allocate(int n, int& mini, int& minc) {//求最小成本及编号
    Perm(n);//求全排列
    for (int i = 0; i < ps.size(); i++) {
        int cost = 0;
        for (int j = 0; j < ps[i].size(); j++) {
            cost += t[j][ps[i][j] - 1];//第j项工作由第ps[i][j]个人完成//-1是因为从0开始
        }
        if (cost < minc) {
            minc = cost;
            mini = i;
        }
    }
    
}

int main()
{
    int mincost = 1e9,mini;//最小成本 ,及排列编号
    scanf_s("%d", &n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf_s("%d", &t[i][j]);
        }
    }
    Allocate(n, mini, mincost);
    printf("%d", mincost);
    return 0;
}

注意事项

脑子锈了,要多用

测试案例:

在这里插入图片描述

总结

这个全排列算法就很让人头大

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

twfplayer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值