邦德 纪中 1236 状压dp

题目大意
  每个人都知道詹姆斯邦德,著名的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.


转载于:https://www.cnblogs.com/a-loud-name/p/6184770.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值