DFS算法——组队(蓝桥填空题)c++

目录:

【问题描述】

【AC代码】

【博主思路】

【问题描述】

作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容。

每位球员担任 1号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5号位的评分之和最大可能是多少?

文件:https://luogu.oss-cn-hangzhou.aliyuncs.com/upload/problem_attachment/5gwa87hc.txt?response-content-disposition=attachment%3B%20filename%3D%22team.txt%22&OSSAccessKeyId=LTAI4FsiWjpNs1epYQp3d1Ag&Expires=1711977020&Signature=bW4ceHpT5Mgfpa0Hj%2Ba1lBqaVe4%3D

(在附件中有一个文件 team.txt,内容与上面表格中的相同,请注意第一列是编号)

AC代码

#include <bits/stdc++.h>//答案490
using namespace std;
int ma=-1000;//初始化最大值为负数,这是个好习惯
int arr[30][6];//初始化一个二维数组
//储存输入数据[30]是因为有20个队员,[6]是因为一个队员跟随着六个数据
int bj[20];//创建标记数组,判断该队员是否被选中过
void dfs(int step,int sum)//dfs模板
{
	if(step>5)//到达条件更新最大值
	{
		ma=max(sum,ma);
		return;//返回上一层
	}
	for(int i=0;i<20;i++)//在所有队员中遍历
	{
		if(bj[i]==0)//如果该队员没被选中过就可以选
		{
			bj[i]=1;//标记该队员此次被选中
			dfs(step+1,sum+arr[i][step]);//dfs
			bj[i]=0;//取消标记,意思是下一个挑选下一个运动员后可以接着挑选这个运动员
		}
	}
}
int main()
{
	for(int i=0;i<20;i++)
	{
		for(int j=0;j<6;j++)
		{
			
			cin>>arr[i][j];
		}
	}
	dfs(1,0);//step从1开始,是因为arr[i][0]表示的是该运动员的序号,对dfs无用
	cout<<ma;//在dfs查找完所有情况后,退出,此时ma最大
	return 0;
}

【博主思路】

博主第一眼看到该题的时候,想用贪心来写,通过五次排序,分别找出一号到五号队员的最大值相加,后来发现不行,因为一个队员有可能他在一号位是评分,在第三号位也是评分,但是一个人只能选择一次,所以不行。又因为这是填空题,不用考虑时间复杂度,可以找出所有组合更新最大值,所以用dfs最好

【一些闲话】

欢迎各位dalao指出错误,提问,博主(bme专业)一定尽力解答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值