2019年第10届蓝桥杯C++(B组省赛)
第一题
组队
本题总分:5 分
【问题描述】
作为篮球队教练,你需要从以下名单中选出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 |
(如果你把以上文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件team.txt,内容与上面表格中的相同,请注意第一列是编号)
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
代码
/*思路:
暴力枚举,dfs,深度优先搜索
依次考虑第1~5号位置的情况(即枚举20位队员)
每选择一位队员,就标记它为true(开一个bool类型的数组)
每一次考虑完了5个位置的情况就判断一下本次与之前的最优解中哪一个是最优解。
说白了,就是使用dfs枚举所有情况并求出最优解!
*/
#include <iostream>
#include <algorithm>
using namespace std;
int team[21][6]; // 存放队员成绩
bool st[21]; // 表示编号为i的队员有没有被选
int ans = 0; // 存放最优解
// 选择第u个位置的队员、当前总分为res
void dfs(int u, int res)
{
if (u == 5) // 选完了5个位置
{
ans = max(ans, res); // 更新最优解
return;
}
// 枚举20个没被选过的队员
for (int i = 1; i <= 20; i++)
{
if (st[i]) continue; // 该编号队员已经被选
st[i] = true; // 标记一下被选了
dfs(u + 1, res + team[i][u + 1]);
st[i] = false; // 回溯
}
}
int main()
{
// 输入20个队员的数据
for (int i = 1; i <= 20; i++)
for (int j = 1; j <= 5; j++)
cin >> team[i][j];
dfs(0, 0);
cout << "ans = " << ans << endl;
return 0;
}
// 下面是数据
/*team.txt(去掉前面的第一列数据)
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
*/