标签:进程 buffer 输入 str tokenize pack system tao except
假设有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)。
标签:进程 buffer 输入 str tokenize pack system tao except
原文地址:https://www.cnblogs.com/Modori/p/11911290.html