hdu 2955

来源:互联网 发布:numbers for mac 编辑:程序博客网 时间:2024/05/16 05:01

题意:有几组测试用例,第一个小数,表示抢劫犯被抓的概率p,第二个数N表示下面有N个银行,下面N行,每行第一个数表示银行有多少钱,第二个数表示能抓住抢劫犯的概率。求在不被抓住的情况下能抢到最多的钱

解析:求反概率,即不被抓住的概率

#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;const int maxn=10009;float dp[maxn];float pp,p[maxn];int cost[maxn];int t,n;int main(){    scanf("%d",&t);    while(t--)    {        scanf("%f%d",&pp,&n);        memset(dp,0,sizeof(dp));        pp=(1-pp);        int sum=0;        for(int i=0;i<n;i++)        {scanf("%d%f",&cost[i],&p[i]);        p[i]=(1-p[i]);        sum+=cost[i];        //printf("%d %f\n",cost[i],p[i]);        }        dp[0]=1.0;        for(int i=0;i<n;i++)        for(int j=sum;j>=cost[i];j--)        {dp[j]=max(dp[j],dp[j-cost[i]]*p[i]);        }        int i;        for(i=sum;i>=0;i--)        if(dp[i]>=pp)        break;        printf("%d\n",i);    }    return 0;}


0 0
原创粉丝点击