工作分配
描述
2020 年,小信自己开了一家拥有 N 个员工的大公司。每天,小信都要分配 N 项工作给他的员工,但是,由于能力的不同,每个人对处理相同工作所需要的时间有快有慢。众所周知,小信是一个非常重视效率的人,他想知道该如何分配工作,才能使得完成所有工作的时间总和最小(每个员工只可以被分配到一个工作)。但是我们也都知道小信不是一般的懒,所以小信找到了你,请你拯救一下小信吧!
输入
第一行输入一个整数 N,代表有 N 个员工,员工编号从 1 到 N。(1 ≤ N ≤ 10)
接着输入一个 N * N 的二维矩阵 task[N][N],task[i][j] 指的是第 i 项工作如果由 j 号员工完成所需要的时间。(0 ≤ task[i][j] ≤ 1000)
输出
输出结果包括一个整数,代表所需要的最少时间(求和)。
输入样例 1
6
10 11 12 11 9 11
11 9 10 13 11 12
12 10 11 10 13 9
9 14 9 10 10 11
10 10 9 11 12 11
10 7 10 10 10 8
输出样例 1
54
提示
样例,第 1 个任务由 5 号员工完成,第 2 个任务由 2 号员工完成,第 3 个任务由 4 号员工完成,第 4 个任务由 1 号员工完成,第 5 个任务由 3 号员工完成,第 6 个任务由 6 号员工完成,花费总时间 9 + 9 + 10 + 9 + 9 + 8 = 54。
人的位置不变,搜索工作的排列方案,记录时间之和,与ans打擂.
代码:
#include<bits/stdc++.h>
using namespace std;
int n,pepol=0;
int x[1000],c[1000][1000];
void dfs(int i,int thing){
if(i>n&&thing<pepol){
pepol=thing;
return ;
}
if(thing<pepol)
for(int j=1;j<=n;j++)
if(x[j]==0){
x[j]=1;
dfs(i+1,thing+c[i][j]);
x[j]=0;
}
}
int main (){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cin>>c[i][j];
x[i]=0;
pepol+=c[i][i];
}
dfs(1,0);
cout<<pepol;
return 0;
}