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

相关文章
相关标签/搜索