目录:
【问题描述】
【AC代码】
【博主思路】
【问题描述】
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容。
每位球员担任 1号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5号位的评分之和最大可能是多少?
(在附件中有一个文件 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专业)一定尽力解答