工作分配(dfs)

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;
} 

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章