题目叙述:
设有A,B,C,D,E 5人从事j1,j2,j3,j4,j5 5项工作每人只能从事一项,它们的效益表如下:
j1 j2 j3 j4 j5
A 13 11 10 4 7
B 13 10 10 8 5
C 5 9 7 7 4
D 15 12 10 11 5
E 10 11 8 8 4
求最佳安排,使效益最高。
这是一道水题
此题先将数组f都设为false(没做)。
然后搜索里判断是否已经做完,如做完就将此次的效率取大值,再将没人做的任务存放起来。
然后因为此题只有5个任务,所以直接for i:=1 to 5判断每一种情况,如果if f[i]=true就是这个任务已经有人做了,就不用判断。如果这个任务没人做过,就进行下一次的搜索。
最后再将每人做什么任务,和最终的效率求出来即可。
代码如下:
const a:array[1..5,1..5]of longint=((13,11,10,4,7),(13,10,10,8,5),(5,9,7,7,4),(15,12,10,11,5),(10,11,8,8,4));
var maxl,y:array[1..5]of longint;
f:array[1..5]of boolean;
ans,i:longint;
procedure dfs(l,x:longint);
var i:longint;
begin
if l>5 then
begin
if x>ans then begin ans:=x; maxl:=y; end;
exit;
end;
for i:=1 to 5 do
if f[i]=false then
begin
y[l]:=i;
f[i]:=true;
dfs(l+1,x+a[l,i]);
f[i]:=false;
end;
end;
begin
fillchar(f,sizeof(f),false);
dfs(1,0);
for i:=1 to 5 do write(chr(i+64),': J',maxl[i],' ');
writeln;
write(ans);
end.