题目描述
在星球争霸篮球赛对抗赛中,最大的宇宙战队希望每个人都能拿到 MVP,MVP是单场最高分得分获得者。MVP可以并列,所以宇宙战队决定在比赛中尽可能让更多队员上场,并且让所有得分的选手得分都相同,然而比赛过程中的每1分钟的得分都只能由某一个人包揽。
输入描述:
输入第一行为一个数字t,表示为有得分的分钟数 1≤t ≤ 50
第二行为t个数字,代表每一分钟的得分 p,1≤p ≤ 50
输出描述:输出有得分的队员都是MVP时,最少的MVP得分.
示例1:
输入:
9
5 2 1 5 2 1 5 2 1
输出:
6
说明:
4人MVP,每个人都是6分。
示例2:
输入:
6
3 2 1 2 1 3
输出:
3
说明:
3人MVP,每个人都是三分
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int t = 0;//有得分的分钟数
int main() {
int arr[50] = { 0 };
int sum = 0;//总得分数
int max = 0;
int bucket[50] = { 0 };
scanf("%d", &t);
for (int i = 0; i < t; i++) {
scanf("%d", &arr[i]);//输入每分钟的得分数
sum = sum + arr[i];
max = max > arr[i] ? max : arr[i];//找到某一分钟得分最大的那个数
}
//printf("%d", max);
for (int i = max; i <= sum; i++) {
if (sum % i == 0) {//此时i可能为mvp得分
int num = sum / i;//可能的mvp个数
memset(bucket, 0, sizeof(bucket));
if (DFS(arr, bucket, 0, i, num)) {
printf("%d", i);
break;
}
}
}
return 0;
}
int DFS(int* arr, int* bucket, int j, int mvpscore,int num) {//第一次输入的参数是DFS(arr, bucket, 0, i, num)
if (j == t) {
return 1;
}
for (int i = 0; i < num; i++) {
if (bucket[i] + arr[j] <= mvpscore) {
bucket[i] = bucket[i] + arr[j];
if (DFS(arr, bucket, ind + 1, mvpscore, num)) {
return 1;//如果能一直DFS下去结束,则可以直接退出DFS递归了
}
bucket[i] = bucket[i] - arr[j];//上面的DFS并不能一直顺利进行下去到结束,证明arr[j]放在那时的bucket[i]中会导致后续递归失败,需要回溯到最开始在bucket[i]中放入arr[j]的那一步,将arr[j]从中减掉,并将此arr[j]放入bucket[i+1]中来继续往下递归DFS
}
}
return 0;
}