2020年,蒜頭君自己開了一家擁有N個員工的大公司。每天,蒜頭君都要分配N項工作給他的員工,但是,由於能力能力的不同,每個人對處理相同工作所需要的時間有所差異。
衆所周知,蒜頭君是一個非常重視效率的人,他想知道改如何分配工作,才能使得完成工作所有工作的時間總和最小(每個員工只能被分配到一個工作)。但是我們也都知道,蒜頭君不是一般的懶,所以蒜頭君找到了你,請你拯救一下蒜頭君吧!
輸入格式
第一行輸入一個整數N,代表有N個員工,員工編號從1到N(1<=N<=10).
接着輸入一個N*N的二維矩陣task[N][N],task[i]j指的是第i項工作如果由j號員工完成所需要的時間。
輸出格式
輸出一個整數,代表所需要的最少時間總和。
樣例輸入
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
樣例輸出
54
分析:題目搜索關鍵,是我們一份工作一份工作得分配,從第一份工作開始,但是有了工作得員工我們不能分配,所以需要一個標記數組used[15].
for(int i=0;i<n;i++){//每份工作分配給六個員工
if(!used[i]){//前提這個員工沒有工作纔可以接下此工作
used[i]=true;//標記當前員工得到了工作
dfs(x+1,t+task[x][i]);//前去下一個工作選人
used[i]=false;//回溯,解除標記
}
}
C語言代碼:
#include<cstdio>
int task[15][15];
bool used[15];
int n;
int min=99999999;
void dfs(int x,int t){
if(x==n){//不能是n-1,因爲到這裏是代表要分配這份工作,是n才代表所有的工作都分配完成
if(t<min){
min=t;//記錄花費最短的時間
}
return ;
}
for(int i=0;i<n;i++){//每份工作分配給六個員工
if(!used[i]){//前提這個員工沒有工作纔可以接下此工作
used[i]=true;//標記當前員工得到了工作
dfs(x+1,t+task[x][i]);//前去下一個工作選人
used[i]=false;//回溯,解除標記
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&task[i][j]);
}
}
dfs(0,0) ;//第一份工作和第一份工作花的時間
printf("%d",min);
return 0;
}