前言
简单问题,写的不好,大佬见谅.
如有疏漏,恳请指正,小编垂首.
问题描述:
工作效率问题

问题解析:
- 要遍历到每一种可能的安排
- 求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;
}
注意事项
脑子锈了,要多用
测试案例:

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

被折叠的 条评论
为什么被折叠?



