清华oj 69. 工作分配(Workload) 回溯法dfs

 有 n 份工作要分配给 n 个人来完成,每个人完成一份。第 i 个人完成第 k 份工作所用的时间为一个正整数 tik,其中1 ≤ i, k ≤ n。试确定一个分配方案,使得完成这 n 份工作的时间总和最小。

输入

输入包含 n + 1 行。

第 1 行为一个正整数 n。

第 2 行到第 n + 1 行中每行都包含 n 个正整数,形成了一个 n × n 的矩阵。在该矩阵中,第 i 行第 k 列元素 tik 表示第 i 个人完成第 k 件工作所要用的时间。

输出

1 行,包含一个正整数,表示所有分配方案中最小的时间总和。

输入样例

5
9 2 9 1 9
1 9 8 9 6
9 9 9 9 1
8 8 1 8 4
9 1 7 8 9

输出样例

5

限制

1 ≤ n ≤ 15

1 ≤ tik ≤ 10^4

思路1 dfs+剪枝 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
#define MAX 16
int vist[MAX];
int d[MAX][MAX];
int n;
int minp=1000000;
void dfs(int cur,int curp)
{
	if(cur==n)
	{
	   if(curp<minp)
	   minp=curp;
	   //cout<<minp<<endl;
	   return;	
	}
	for(int i=0;i<n;i++)
	{
		if(vist[i]==false&&d[cur][i]+curp<minp)
		{
			vist[i]=true;
			dfs(cur+1,d[cur][i]+curp);
			vist[i]=false;
		}
	}
}
int main()
{
	
	cin>>n;
	for(int i=0;i<n;i++)
	 for(int j=0;j<n;j++)
	 {
 		cin>>d[i][j];
 	 }
 	dfs(0,0); 
 	cout<<minp<<endl;
}

猜你喜欢

转载自blog.csdn.net/qiang_____0712/article/details/87867052