Description
假设有n个任务由k个并行工作的机器来完成。完成任务i需要的时间为Ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
算法设计:对任意给定的整数n和k,以及完成任务i需要的时间为Ti,i=1,2,3……n。计算完成这n个任务的最佳调度。
Input
第一行有2个正整数n和k。第2行的n个正整数是完成n个任务需要的时间。
Output
将计算的完成全部任务的最早时间
Sample Input
7 3
2 14 4 16 6 5 3
Sample Output
17
这题我是用搜索来做的
这题有点像接水问题
var
n,k,tj,i:longint;
b,t:array[0..10000]of longint;
procedure kp(l,r:longint);
var
i,j,mid:longint;
begin
if l>=r then exit;
i:=l;j:=r;mid:=t[(l+r)div 2];
repeat
while t[i]>mid do inc(i);
while t[j]<mid do dec(j);
if i<=j then
begin
t[0]:=t[i];t[i]:=t[j];t[j]:=t[0];
inc(i);dec(j);
end;
until i>j;
kp(l,j);
kp(i,r);
end;
procedure search(dep,time:longint);
var
i:longint;
begin
if dep>n then
if time<tj then
begin
tj:=time;
exit;
end;
if time>=tj then exit;
for i:=1 to k do
begin
b[i]:=b[i]+t[dep];
if b[i]>time then search(dep+1,b[i]) else search(dep+1,time);
b[i]:=b[i]-t[dep];
end;
end;
begin
readln(n,k);tj:=10000;
fillchar(t,sizeof(t),0);
for i:=1 to n do
read(t[i]);
kp(1,n);
fillchar(b,sizeof(b),0);
search(1,0);
write(tj);
end.