5-17 最佳调度问题
问题描述
假设有 n 个任务由 k 个可并行工作的机器完成。完成任务 i 需要的时间为 ti t i 。试设计一个算法找出完成这 n 个任务的最佳调度,使得完成全部任务的时间最早。
对任意给定的整数 n 和 k,以及完成任务 i 需要的时间为 ti t i ,i=1~n。编程计算完成这 n个任务的最佳调度。
数据输入:
第一行有 2 个正整数 n 和 k。第 2 行的 n 个正整数是完 成 n 个任务需要的时间。
Java
package Chapter5HuiSuFa;
import java.util.Scanner;
public class ZuiJiaDiaoDu {
private static int MAX = 100000;
private static int n,k;
private static int[] t,len;
private static int best;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
while (true){
best = MAX;
n = input.nextInt();
k = input.nextInt();
t = new int[n];
len = new int[k];
for(int i=0; i<n; i++)
t[i] = input.nextInt();
search(0);
System.out.println(best);
}
}
private static void search(int dep){
if(dep == n){
int tmp = comp();
if(tmp < best)
best = tmp;
return;
}
for(int i=0; i<k; i++){
len[i] += t[dep];
if(len[i] < best) search(dep+1);
len[i] -= t[dep];
}
}
private static int comp(){
int tmp = 0;
for(int i=0; i<k; i++)
if(len[i] > tmp)
tmp = len[i];
return tmp;
}
}
Input & Output
7 3
2 14 4 16 6 5 3
17
Reference
王晓东《计算机算法设计与分析》(第3版)P185