【蓝桥杯考前突击】第十届蓝桥杯省赛C/C++大学B组 试题 A 组队

  作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,
组成球队的首发阵容。
  每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1
号位至 5 号位的评分之和最大可能是多少?


编号 1 号位 2 号位 3 号位 4 号位 5 号位
1 97 90 0 0 0 
2 92 85 96 0 0 
3 0 0 0 0 93
4 0 0 0 80 86
5 89 83 97 0 0 
6 82 86 0 0 0 
7 0 0 0 87 90
8 0 97 96 0 0 
9 0 0 89 0 0
10 95 99 0 0 0
11 0 0 96 97 0
12 0 0 0 93 98
13 94 91 0 0 0
14 0 83 87 0 0
15 0 0 98 97 98
16 0 0 0 93 86
17 98 83 99 98 81
18 93 87 92 96 98
19 0 0 0 89 92
20 0 99 96 95 81
一个五分题的优秀解法
摘自亓官劼
将数据直接复制进Excel,每号位进行降序排列,选出前5行,最后找出 不同人 的每号位最高,求和
答案为490
#include<stdio.h>
#include<iostream>
using namespace std; 
int p[25][6];//保存每个人的各个位置的得分
int ans;//存储最终结果 
bool dp[6];//表示当前位置是否有人选 
void dfs(int now_person,int now_selected,int now_sum_score){
    
    //当前是第几个人,当前选好了几个人,当前分数是多少 
	//如果说所有人都转了一遍,那就结束了。或者说已经选够了,那也就结束了。 
	if(now_person==20||now_selected==5){
    
    
		if(now_sum_score>ans){
    
    
			ans=now_sum_score;
		}
		return;
	}
	//走到谁能选就必须选(选) 
	for(int i=1;i<=5;i++){
    
    
		if(!dp[i]){
    
    
			dp[i]=true;
			dfs(now_person+1,now_selected+1,now_sum_score+p[now_person+1][i]);
			dp[i]=false;
		}
	}
	//走到谁可以不选(不选)
	dfs(now_person+1,now_selected,now_sum_score);
}
int main(){
    
    
	for(int i=1;i<=20;i++){
    
    
		for(int j=1;j<=5;j++){
    
    
			cin>>p[i][j];
		}
	}
	dfs(0,0,0);
	cout<<ans<<endl; 
	return 0;
} 
/*
97 90 0 0 0
92 85 96 0 0 
0 0 0 0 93
0 0 0 80 86
89 83 97 0 0 
82 86 0 0 0 
0 0 0 87 90
0 97 96 0 0 
0 0 89 0 0
95 99 0 0 0
0 0 96 97 0
0 0 0 93 98
94 91 0 0 0
0 83 87 0 0
0 0 98 97 98
0 0 0 93 86
98 83 99 98 81
93 87 92 96 98
0 0 0 89 92
0 99 96 95 81
*/
/*
答案为490
*/

有问题可以留言交流٩(๑❛ᴗ❛๑)۶

猜你喜欢

转载自blog.csdn.net/kieson_uabc/article/details/109002732