蓝桥杯 历届真题 题解目录
试题 A: 组队
本题总分: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,内容与上面表格中的相同, 请注意第一列是编号)
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:490
分析:
行就是每个人,列就是每个人对应位置的分数。
和皇后问题差不多,标记行和列,每行即每个人只能出一个位置,每列即每个位置只能由一个人来参加。
标记完直接dfs深搜回溯吧。
我加了一个对于这题很有用的剪枝条件,就是,这样就能筛选掉很多的数据啦~
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int arr[20][5];
int r[20] = { 0 };
int c[5] = { 0 };
int ans = 0;
void dfs(int count, int sum)
{
if (count == 5)
{
ans = max(ans, sum);
return;
}
for (int i = 0; i < 20; i++)
{
if (r[i]) continue;
r[i] = 1;
for (int j = 0; j < 5; j++)
{
if (c[j] || arr[i][j] == 0) continue;
c[j] = 1;
dfs(count + 1, sum + arr[i][j]);
c[j] = 0;
}
r[i] = 0;
}
}
int main()
{
freopen("text.ini", "r", stdin);
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 5; j++)
cin >> arr[i][j];
}
dfs(0, 0);
cout << ans << endl;
cout << "over" << endl;
while (1);
return 0;
}