蓝桥杯刷题——组队(搜索)

214 阅读2分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。

这是19年蓝桥杯省赛的一道填空题,题目给出的数据并没有很复杂,多试几遍可能就能试出来。但从算法上来说,这其实可以算是一道很经典的深度优先搜索题目。

题目

你是一名篮球教练,要从20名选手中选出5名选手去打比赛,下面是这20个选手在5个位子上不同的得分,如何选择才能选出5个人在五个位子上的评分之和最高。

image.png

思路

数据规模较小,很明显,我们可以使用暴力搜索,找出全部的组合,最后得出最大的评分和。接下来就是思考如何搜索。看着这个二维数据,我们很容易就能想到使用深度优先遍历搜索。知道使用深度优先遍历搜索之后,便是制定每次遍历的条件。我们可以从每列的20个数据入手,从第一列开始,每个人都可以去打1号位,然后这个位子是ture,再从第二列数据入手,选中了那么这个数据位子就是ture。每次一个组合完成后,要立马让这个位子又变成flase。这样就能遍历全部的组合。终止条件便是已经遍历到了第5列,得出评分和,返回即可。我们需要设置两个参数,第一个参数是到了第几列,第二个参数就是当前组合的评分和。再设置一个if,得出最大的评分和即可得出答案。

代码

#include <bits/stdc++.h>
using namespace std;
int m[6][21];
bool vis[21];
int ans=0;
void dfs(int x,int add)
{
	if (x==6)
	{
		if (ans<add)
		{
			ans=add;
		}
		return ;
	}
	for (int i=1;i<=20;i++)
	{
		
		if (!vis[i]&&m[x][i]!=0)
		{
			vis[i]=true;
			dfs=(x+1,add+m[x][i]);
			vis[i]=false;
		}
	}
}
int main ()
{
	
	for (int i=1;i<=5;i++)
	{
		for (int j=1;j<=20;j++)
		{
			cin>>m[i][j]; 
		}
	}
	
	dfs(1,0);//从第一列开始,评分和为0
	cout<<ans;
	return 0;
 }