【问题描述】作为篮球队教练,你需要从以下名单中选出1号位至5号位各一名球员,组成球队的首发阵容。每位球员担任1号位至5号位时的评分如下表所示。请你计算首发阵容1号位至5号位的评分之和最大可能是多少?
要从20个人中选出5个人,而且这五个人的位号不能重复,在写这道题首先要注意每个编号只能使用一次而且每个人的位号各不相同。在这里我是用的递归来实现,为了避免位号重复定义一个int类型的num记录位号,每选择一个成员,下一次递归位号都会加一,直到选择五个为止;为了避免成员重复定义一个boolean类型的数组arr3记录成员的选取情况。
答案:490
代码:
public class Text01 {
public static int[][] arr1 = new int[][]
{{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},};
//arr2记录数值
public static int[] arr2 = new int[5];
public static int max = 0;
public static void main(String[] args) {
//arr3记录五个位置的队员编号
boolean[] arr3 = new boolean[20];
zudui(0,arr3);
System.out.println(max);
}
public static void zudui(int num,boolean[] arr) {
if(num == 5) {
int sum = 0;
for(int i=0; i<arr2.length; i++) {
sum += arr2[i];
}
if(sum>max) {
max = sum;
}
}else {
for(int i=0; i<arr1.length; i++) {
if(!arr[i]) {
//如果该编号成员未被选中标记该成员
arr[i] = !arr[i];
arr2[num] = arr1[i][num];
zudui(num+1,arr);
//递归完后要将被递归的编号取消标记
arr[i] = !arr[i];
}
}
}
}
}