题目大意
每个人都知道詹姆斯邦德,著名的007,但很少有人知道很多任务都不是他亲自完成的,而是由他的堂弟们吉米邦德完成(他有很多堂弟),詹姆斯已经厌倦了把一个个任务分配给一个个吉米,他向你求助。每个月,詹姆斯都会收到一些任务,根据他以前执行任务的经验,他计算出了每个吉米完成每个任务的成功率,要求每个任务必须分配给不同的人去完成,每个人只能完成一个任务。
请你编写程序找到一个分配方案使得所有任务都成功完成的概率。
分析
一开始就想了一个最大权匹配,于是就开开心心的打了一个KM求最大权匹配。为了不上台讲,我还故意打小了数组大小(因为我也讲不清最大权匹配)
ps:又是他*4——
olahiu j“教”我改小数组的。
但是,只拿了85分。
所以,正解是状压dp。
自己看代码,不想说。
代码
var
f:array[0..3000000] of real;
a:array[0..200,0..200] of real;
sum:array[0..200] of longint;
w:array[0..200] of longint;
i,j,k:longint;
n:longint;
function max(x,y:real):real;
begin
if x>y
then exit(x)
else exit(y);
end;
begin
readln(n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(a[i,j]);
a[i,j]:=a[i,j]/100;
end;
readln;
end;
sum[1]:=1;
f[0]:=1;
for i:=2 to n do
sum[i]:=sum[i-1]*2;
for i:=1 to sum[n]*2-1 do
begin
fillchar(w,sizeof(w),0);
for j:=1 to n do
if i and sum[j]<>0
then
begin
w[0]:=w[0]+1;
w[w[0]]:=j;
end;
for j:=1 to w[0] do
f[i]:=max(f[i],f[i-sum[w[j]]]*a[w[0],w[j]]);
end;
write(f[sum[n]*2-1]*100:0:6);
end.