7-2 最佳調度問題 (40 分)

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

相關文章
相關標籤/搜索