假設有n(n<=20)個任務由k(k<=20)個可並行工作的機器完成。完成任務i需要的時間為ti。 試設計一個算法,對任意給定的整數n和k,以及完成任務i 需要的時間為ti ,i=1~n。計算完成這n個任務的最佳調度,使得完成全部任務的時間最早。
輸入格式:
輸入數據的第一行有2 個正整數n和k。第2 行的n個正整數是完成n個任務需要的時間。
輸出格式:
將計算出的完成全部任務的最早時間輸出到屏幕。
輸入樣例:
在這里給出一組輸入。例如:
7 3
2 14 4 16 6 5 3
輸出樣例:
在這里給出相應的輸出。例如:
17
本題同樣采用回溯法,首先枚舉初所有可能情況,然后剪枝:
package 宿題;
import java.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;
}
}
該算法的時間復雜度為O(k2^n)。