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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM