题目来源:第十届蓝桥杯省赛C++B组
算法标签:dfs
题目描述:
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容。 每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少?
思路:
意思是说我们要从20人里面选出5个人的阵容使得他们总数最大。
显然看不出什么贪心莽夫技巧,那么我们使用dfs暴搜,每个组合更新最大值,最后输出最大值即可。
题目代码:
#include<iostream>
using namespace std;
int team[20][6];
int max_sum;
bool st[20];
int max(int a,int b){return a>b?a:b;}
void dfs(int u,int sum)//u当前选择团队的第几人,sum当前团队总值
{
if(u>5){max_sum=max(max_sum,sum);return;}//如果选完了,更新最大值,退出
for(int i=0;i<20;i++)//20人
{
if(!st[i])//如果当前人没有被选择
{
st[i]=true;//被选
dfs(u+1,sum+team[i][u]); //选下一个人,队伍总值增加当前人的当前号位的值
st[i]=false;//回溯
}
}
}
int main()
{
for(int i=0;i<20;i++)
for(int j=0;j<6;j++)
cin>>team[i][j];//读队伍
dfs(1,0);//从第一个人开始选,当前总和为0
cout<<max_sum;
return 0;
}
答案
490