HDU 2955(Robberies)0-1背包问题

来源:互联网 发布:手指数算法5加6怎么算 编辑:程序博客网 时间:2024/06/06 03:41

这题看起来有点像最大报销额度,貌似要求的问题是小数。

题目给的是每个银行被抓的概率,我们要转换成逃跑的概率,而且概率是乘积:(1-p1)*(1-p2)...*(1-pn),才是跑掉的概率。

0-1背包问题,把概率当容量显然不行,精度不行,不像最大报销额度只要2位小数。我们把概率当价值,钱当容量,计算出抢到m钱的最大逃跑率是多少。然后从所有银行钱总量往前找,找到第一个逃跑概率满足要求的便是能抢到最多的钱。

还有比较大小时候的返回类型

代码:

#include<stdio.h>#include<string.h>double Max(double a,double b){return a>b?a:b;}int main(){double p[101],dp[10001];double pp;int val[101];int T,i,j,n,maxm;scanf("%d",&T);while(T--){scanf("%lf%d",&pp,&n);memset(val,0,sizeof(val));memset(p,0,sizeof(p));memset(dp,0,sizeof(dp));maxm=0;for(i=0;i<n;i++){scanf("%d%lf",&val[i],&p[i]);p[i]=1-p[i];maxm+=val[i];}dp[0]=1;for(i=0;i<n;i++){for(j=maxm;j>=val[i];j--)dp[j]=Max(dp[j-val[i]]*p[i],dp[j]);}for(i=maxm;i>=0;i--)if(1-dp[i]<pp)break;printf("%d\n",i);}return 0;}


0 0