题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
作为篮球队教练,你需要从以下名单中选出 11 号位至 55 号位各一名球员,组成球队的首发阵容。
每位球员担任 11 号位至 55 号位时的评分如下表所示。请你计算首发阵容 11 号位至 55 号位的评分之和最大可能是多少?
问题分析
首先将表格转化成数据我定义了一个选手的二维数组第一维表示是第几位选手,第二维表示选手几号位的成绩,这样将表格转化为数据储存在计算机中,在计算其最大和时不能简单的寻找其每一号位的最大值相加,因为一个选手只能在一个位置,且每一个位置的最大值非同一选手的相加结果并不一定是最大的,举一个例子
9 | 9 | 9 |
8 | 7 | 7 |
7 | 8 | 8 |
第一行取9第二行取8第三行取7这样结果是24
但是第一行取8第二行取9第三行取8结果是25
所以只关注局部最优相加的整体并不一定最优。
我解决的思路遍历每一种可能的组合,随时更新最大值,这样最后的结果一定是最大的。
代码实现
#include<stdio.h>
int main(){
int xuanshou[20][5]={//将表格转化为数据
{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}
};
int max=0;//记录最大值
for(int i=0;i<20;i++){//一号位的选手可能性
for(int j=0;j<20;j++){//二号位的选手可能性
if(i!=j)//一号位与二号位的选手不能是同一位选手
for(int k=0;k<20;k++){//同上
if(k!=i&&k!=j)
for(int l=0;l<20;l++){
if(l!=i&&l!=j&&l!=k)
for(int m=0;m<20;m++){
if(m!=i&&m!=j&&m!=k&&m!=l){//求出分数之和
int sum=xuanshou[i][0]+xuanshou[j][1]+xuanshou[k][2]+xuanshou[l][3]+xuanshou[m][4];
if(max<sum){//比较,根据比较结果来决定是否更新最大值
max=sum;
}
}
}
}
}
}
}
printf("%d",max);//输出结果
return 0;
}