HDU 2955 Robbery ( 动归 )

题意: 题目给出了n家银行每家银行可偷的钱以及被抓的概率,求在总的被抓概率不超过P的最大可偷的钱数。
分析: 状态转移方程:dp[j]=max( dp[j],dp[j-money]*p)
dp[j] : 表示偷j 价值的钱时,不会被捕的最大概率。
被抓概率不超过P,即不被抓的概率大于等于1-P ;
由于所有的可能性都是独立的,概率应是相乘。


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define loop(i,k,n) for(int i=k;i<=n;i++)
#define loop2(i,k,n) for(int i=n;i>=k;i--)
using namespace std;
#define INF 10005
float dp[INF],po[105];
int mo[105];
int main()
{
    int t,n;
    float p;
    scanf("%d",&t);
    while(t--)
    {
        int sum=0,k;
        scanf("%f%d",&p,&n);
        loop(i,1,n)
            scanf("%d%f",mo+i,po+i),po[i]=1.0-po[i],sum+=mo[i];
        memset(dp,0,sizeof(dp));//初始化
        dp[0]=1; //未偷窃是一定不会被抓的
        loop(i,1,n)
            loop2(j,mo[i],sum)
             dp[j]=max(dp[j],dp[j-mo[i]]*po[i]);
        for(k=sum;k>=0;k--)
            if(dp[k]>= 1.0-p)
             break;
        printf("%d\n",k);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值