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; }