假设有n(n<=20)个任务由k(k<=20)个可并行工做的机器完成。完成任务i须要的时间为ti。 试设计一个算法,对任意给定的整数n和k,以及完成任务i 须要的时间为ti ,i=1~n。计算完成这n个任务的最佳调度,使得完成所有任务的时间最先。java
输入数据的第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务须要的时间。算法
将计算出的完成所有任务的最先时间输出到屏幕。设计
在这里给出一组输入。例如:code
7 3 2 14 4 16 6 5 3
在这里给出相应的输出。例如:递归
17
本题一样采用回溯法,首先枚举初全部可能状况,而后剪枝:进程
package 宿題;
import java.io.*;io
public class PTAOptimalScheduling {
static int max=Integer.MAX_VALUE;//max初始化直接取最大值;
static int n;
static int k;
public static void main(String args[])throws IOException{
StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken();
n=(int)in.nval;
in.nextToken();
k=(int)in.nval;
int a[]=new int[n];//用来存放进程时间;
int b[]=new int[k];//用来建立k台机器;
for(int i=0;i<n;i++){
in.nextToken();
a[i]=(int)in.nval;
}
Count(a,b,0);
System.out.println(max);//输出最终值;
}
private static void Count(int a[],int b[],int array){
if(array==n){//本轮递归结束,比较结果;
if(Max(b)<max)
max=Max(b);
}else if(Max(b)<max){
for(int i=0;i<k;i++){//分为k个分支,向下求解;
b[i]+=a[array];
Count(a,b,array+1);
b[i]-=a[array];//还原b[]的值,使其不干扰其余分支;
}
}
}
private static int Max(int a[]){//比较返回最大值;
int max=a[0];
for(int i=0;i<k;i++)
if(a[i]>max&&a[i]!=0)
max=a[i];
return max;
}
}class
该算法的时间复杂度为O(k2^n)。import