• 【题解】危险的工作-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
  • 相关阅读:
    笛卡尔树学习笔记
    图论基础(自认为很全)
    我的博客在这里
    C++学习资料
    test
    个人介绍
    CF1153F Serval and Bonus Problem
    【ZJOI2020】抽卡
    【LOJ】小 Q 的序列
    我的个人博客:https://xyix.github.io
  • 原文地址:https://www.cnblogs.com/moyujiang/p/11167734.html
Copyright © 2020-2023  润新知