【题解】危险的工作-C++

Description
给出一个数字N,N<=11.代表有N个人分担N个危险的工作。
每个人对应每个工作,有个危险值
每个人担任其中一项,问每个人危险值相加,最小值是多少。
Input
第一行给出数字N,接下来N行N列
第i行第j列,代表第i个人担负第j个工作的危险值是多少

Output
如题
Sample Input
3
10 2 3
2 3 4
3 4 5
Sample Output
9

这道题目就是一道DFS的题目,每次考察取哪一个人做哪一个项目,但是要注意的是:

1.已经有项目的人不能再安排了
2.如果遇到当前危险值大于目前最小危险值的情况,剪枝

因为这道题目数据较小,所以不需要过分剪枝就可以AC。

#include<bits/stdc++.h>
using namespace std;
int n,d[20][20];
bool flag[20];
int ans=0x3f3f3f3f;
void dfs(int dep,int sum)
{
	if(sum>ans)return;
	if(dep==n+1)
	{
		ans=sum;
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(!flag[i])
		{
			flag[i]=1;
			dfs(dep+1,sum+d[i][dep]);
			flag[i]=0;
		}
	}
	return;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>d[i][j];
		}
	}
	dfs(1,0);
	cout<<ans<<endl;
	return 0; 
}
个人博客地址: www.moyujiang.com 或 moyujiang.top
原文地址:https://www.cnblogs.com/moyujiang/p/11167734.html