[第十届蓝桥杯省赛C++B组]组队

题目来源:第十届蓝桥杯省赛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

发布了180 篇原创文章 · 获赞 19 · 访问量 5790

猜你喜欢

转载自blog.csdn.net/weixin_43910320/article/details/105167505
今日推荐