问题描述
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式
第一行两个整数N,M。 一行N个整数,表示木棍的长度。
输出格式
一行一个整数,表示最小的差距
样例输入
3 2 10 20 40
样例输出
10
数据规模和约定
N, M<=7
只通过了百分之90 的案例 7 个的时候超时了 俺也不知到如何优化
import java.util.Scanner;
public class Main {
static int min_sub; // 最小的差距
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] mg;
int[] mg_flag ;
int[] D_length ;
min_sub = 700000;
int M , N ; // N 木棍 M 几段
Scanner sc= new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
mg = new int[N];
mg_flag = new int[N];
D_length = new int[M];
for (int i = 0; i < mg.length; i++) {
mg[i] = sc.nextInt();
}
dfs(N,mg,mg_flag,D_length);
System.out.println(min_sub);
}
static void dfs(int dd,int[] mg,
int[] mg_flag,int[] D_length
) {
if(dd == 0) {
// 分完了 检测当前的 最大插差值
if(min_sub>=getNowChazhi(D_length)) {
min_sub = getNowChazhi(D_length);
return ;
}
}
// 开始分了
for (int i = 0; i < mg.length ; i++) {
// 首先要分的棍子必须是没被分过的
if(mg_flag[i]==0){
// 都给谁呢? 0 - M -1
for (int j = 0; j < D_length.length; j++) {
mg_flag[i]=1; // 用过了
D_length[j] += mg[i];
dfs(dd-1,mg,mg_flag,D_length);
D_length[j] -= mg[i];
mg_flag[i]=0;
// 回溯
}
}
}
}
static int getNowChazhi(int[] D_length) {
int max = 0;
int min = 70000000;
for (int i = 0; i < D_length.length; i++) {
if(max<D_length[i]) max = D_length[i];
if(min>D_length[i]) min = D_length[i];
}
return Math.abs(max-min);
}
}