蒜頭君開公司
題目描述:
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;
}