作为篮球队教练,你需要从以下名单中选出 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
*/
有问题可以留言交流٩(๑❛ᴗ❛๑)۶