蒜頭君開公司---dfs

蒜頭君開公司

題目描述:

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)
輸出格式
輸出結果包括一個整數,代表所需要的最少時間(求和)。
樣例輸入
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

解題思路:

每個任務只能分配給一個人做,深搜,找到所有的任務分配方案(全排列),求出用時最少的那個即可。

AC代碼:

// 蒜頭君開公司
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <string.h>
#include <math.h>
using namespace std;
int task[15][15];
int n;//員工個數=任務個數(一個員工分配一個工作) 
int ans=20000;
int vis[15];
void dfs(int index,int sum)//分配到第index個工作 
{
	int i;
	if(index==n)
	{
		if(sum<ans)
		{
			ans=sum;
			return ;
		}
	}
	for(i=0;i<n;i++)
	{
		if(!vis[i])
		{
			vis[i]=1;
			dfs(index+1,sum+task[index][i]);
			vis[i]=0;
		}
	}
}
int main()//全排列,求最小值 
{
	int i,j;
	//task[i][j] 指的是第 i 項工作如果由 j 號員工完成所需要的時間。
	cin>>n;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			cin>>task[i][j];
	dfs(0,0);
	cout<<ans<<endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章