思路:递归
k :要分的段数
1、当k = 1,则输出该数组的和
2、当k = 数组元素个数,输出数组的最大值即可
3、其他情况的话,考虑第一段的所有情况,要保证第一段后面的元素大于等于k-1,不然不能分成k-1段。对后面的k-1段使用递归函数
package Array;
public class KPart {
/**
* 把一个数组分为k段,使所有段的和的最大值最小。
*/
public static int kPart(int[] arr, int start,int end, int k){
if(k == 1){
int sum = 0;
for(int i = start; i <= end; i++){
sum += arr[i];
}
return sum;
}
if((end - start + 1) == k){
int max = Integer.MIN_VALUE;
for(int i = start; i <= end; i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
int min = Integer.MAX_VALUE;
for(int i = start; i <= end + 1 - k; i++){
// System.out.println("进入该循环");
int sum = 0;
for(int j = start; j <= i; j++){
sum += arr[j];
}
int larger = sum > kPart(arr,i + 1, end,k - 1) ? sum : kPart(arr,i + 1, end,k - 1);
if(larger < min){
min = larger;
}
}
return min;
}
public static void main(String[] args){
int[] arr = {1,2,3,4,-8};
System.out.print(kPart(arr,0,arr.length - 1,3));
}
}