假設有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