试题 算法训练 粘木棍
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式
第一行两个整数N,M。
一行N个整数,表示木棍的长度。
输出格式
一行一个整数,表示最小的差距
样例输入
3 2
10 20 40
样例输出
10
数据规模和约定
N, M<=7
代码如下:
import java.util.Scanner;
public class Main{
static int mm;
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int M=sc.nextInt();
int[] a=new int[N];
for(int i=0;i<N;i++) {
a[i]=sc.nextInt();
mm+=a[i];
}
int[] b=new int[M];
int[] c=new int[N];
//b 记录每根木棍长度,c记录木棍是否使用
fun(a,b,c,0,N,M);
System.out.print(mm);
}
public static void fun(int[] a,int[] b,int[] c,int k,int n,int m) {
if(k<n) {
for(int i=0;i<m;i++) {
if(c[k]==0) {
b[i]+=a[k];
c[k]=1;
fun(a,b,c,k+1,n,m);
c[k]=0;
b[i]-=a[k];
}
}
}else {
int max=b[0],min=b[0];
for(int i=0;i<m;i++) {
if(b[i]>max) {
max=b[i];
}
if(b[i]<min) {
min=b[i];
}
}
if(max-min<mm) {
mm=max-min;
}
}
}
}