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

posted on 2019-11-22 15:06  ミドリ  阅读(1545)  评论(0编辑  收藏  举报