hdu 2955 Robberies

来源:互联网 发布:万网域名备案注销 编辑:程序博客网 时间:2024/05/22 12:53

题意Roy 要去抢银行,给你一个Roy 的被抓概率,再给出N个银行的钱和抓捕概率。求能抢的最大的钱数。

由概率的知识可知,要求被抓概率,需要先求反面,也就是逃脱的概率,只有逃脱的概率才能连乘。

构造dp[i]表示抢到i数量的钱最大的逃脱概率。


转移方程 dp[i]=max(dp[i],dp[i-cost[j]]*p[j]);  cost[j]代表第j个银行的钱,p[j]代表第j个银行的逃跑概率(1-被抓概率).

dp[0]=1抢0个银行逃脱率100%

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;double dp[20000];double p[20000];int cost[1000];int main(){    int t,n;    double f;    int a;    int sum;    scanf("%d",&t);    while(t--)    {        sum=0;        scanf("%lf %d",&f,&a);        f=1-f;        memset(dp,0,sizeof(dp));        for(int i=1;i<=a;i++)        {            scanf("%d %lf",&cost[i],&p[i]);            sum+=cost[i];            p[i]=1-p[i];        }        dp[0]=1;        for(int i=0;i<=a;i++)        for(int j=sum;j>=cost[i];j--)        {            dp[j]=max(dp[j],dp[j-cost[i]]*p[i]);        }     //   cout<<"sum="<<sum<<endl;        for(int i=sum;i>=0;i--)        {     //  printf("dp[%d]=%lf\n",i,dp[i]);            if(dp[i]>=f)            {                printf("%d\n",i);                break;            }        }    }    return 0;}


原创粉丝点击