题意: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;
}