HDU 2955 Robberies 01背包

题意:

一个强盗要去抢劫银行,对于每个银行来说,都有一个不被抓的概率p,和能抢劫到的钱数money,每个银行最多只可以被抢劫一次。问在不被抓的总概率P下,怎样得到最大价值的钱数。

根据题目的已知条件, 该问题可以使用基本01背包模型
    银行数量:N
    每家银行所拥有的金钱数量: money[i]
    盗取各家银行的风险指数: risks[i]
    个人所能承担的风险的极限: V
    求在风险范围内, 盗取最多的资金

提到"the probability of getting caught from robbing", 是指被抓的概率. 设盗取第i家银行的概率是Pi, 盗取第i家银行逃跑的概率是Ri
   则 Pi = 1 - Ri
   且盗取多家(i家)银行被抓的概率 PPi = 1 - (R1*R2*R3*...*Ri), 这中间有个转换过程

要使我们的被抓的概率最小,自然要使不被抓的概率最大
    

这个问题应该反过来考虑:

f[j]表示拿到j块大洋不被抓的概率  

f[j-money[i]]:  抢劫过

    for(int i=1;i<=n;i++){
                cin>>money[i]>>pi[i];
                sum+=money[i];
            }
            memset(f,0,(sum+1)*sizeof(f[0]));
            f[0]=1;
            for(int i=1;i<=n;i++)
                for(int j=sum;j>=money[i];j--){
                    double temp=f[j-money[i]]*(1.0-pi[i]);
                    f[j]=max(f[j],temp);
                }
            for(k=sum;1-f[k]>=P;k--);
               cout<<k<<endl;
            }
            

 

posted @ 2015-11-17 17:20  咸咸的告别  阅读(130)  评论(0编辑  收藏  举报