HDU 2955 - Robberies

来源:互联网 发布:步兵樱井知香影音先锋 编辑:程序博客网 时间:2024/05/22 15:39

知识点:01背包的概率问题

当前的概率基于前一种状态的概率,即偷n家银行而不被抓的概率等于偷n-1家银行不被抓的概率乘以偷第n家银行不被抓的概率。

用dp[i]表示偷价值为i时不被抓的概率,则状态转移方程为:dp[i]=max(dp[i],dp[i-m]*(1-p))。

#include <cstdio>#include <memory.h>double dp[10001];int sum;inline double max(double a,double b){    return a>b ? a : b;}void ZeroOnePack(int m,double p){    for(int i=sum;i>=m;i--)    dp[i]=max(dp[i],dp[i-m]*(1-p));}int main(){    int t,n,m[100];    double p[100],P;    scanf("%d",&t);    while(t--)    {        scanf("%lf%d",&P,&n);        sum=0;        for(int i=0;i<n;i++)        {            scanf("%d%lf",&m[i],&p[i]);            sum+=m[i];        }        memset(dp,0,sizeof(dp)),dp[0]=1;        for(int i=0;i<n;i++)        ZeroOnePack(m[i],p[i]);        int i;        for(i=sum;i>=0&&1-dp[i]>P;i--);        printf("%d\n",i);    }    return 0;}


原创粉丝点击