HDOJ 2955 Robberies 简单01背包+简单概率思想

来源:互联网 发布:php v phpinfo 编辑:程序博客网 时间:2024/06/11 20:22
/***       与其说这题考背包,不如说考概率。*   比较容易想到的是,把被抓到的概率乘100,加卡精度来做背包容量,钱就做背包价值*   可是不行! 这精度卡不了诶。。还是wa*       换种想法,题目给出的被抓的概率p,那(1-p)就是不被抓的概率。*   然而,让dp[i]表示抢到i百万的逃跑成功率。 那么如何计算?*   如果要抢到i百万需要抢n个银行,那么就是抢这n个银行的逃跑成功率的乘积。 为什么?*   概率知识吧,因为n个银行都必须成功且又是独立的事件,所以根据乘法原理就那样了。。 贴人代码吧*/#include<stdio.h>#include<string.h>double dp[10000];int mm[1000];double pp[1000];double max(double a, double b){    return a>b? a:b;}int main(){    int cas,n,i,j,sum;    double p;    scanf("%d",&cas);    while(cas--)    {        scanf("%lf %d",&p,&n);        for(i=0,sum=0; i<n; i++)        {            scanf("%d %lf",&mm[i],&pp[i]);            sum += mm[i];        }        memset(dp,0,sizeof(dp));        dp[0] = 1;        for(i=0; i<n; i++)            for(j=sum; j>=mm[i]; j--)                dp[j] = max(dp[j],dp[j-mm[i]] * (1-pp[i]));          for(i=sum; i>=0; i--)          {              if(dp[i]>=(1-p))              {                  printf("%d\n",i);                  break;              }          }    }    return 0;}

原创粉丝点击