这题看起来有点像最大报销额度,貌似要求的问题是小数。
题目给的是每个银行被抓的概率,我们要转换成逃跑的概率,而且概率是乘积:(1-p1)*(1-p2)...*(1-pn),才是跑掉的概率。
0-1背包问题,把概率当容量显然不行,精度不行,不像最大报销额度只要2位小数。我们把概率当价值,钱当容量,计算出抢到m钱的最大逃跑率是多少。然后从所有银行钱总量往前找,找到第一个逃跑概率满足要求的便是能抢到最多的钱。
还有比较大小时候的返回类型
代码:
#include<stdio.h>
#include<string.h>
double Max(double a,double b)
{
return a>b?a:b;
}
int main()
{
double p[101],dp[10001];
double pp;
int val[101];
int T,i,j,n,maxm;
scanf("%d",&T);
while(T--)
{
scanf("%lf%d",&pp,&n);
memset(val,0,sizeof(val));
memset(p,0,sizeof(p));
memset(dp,0,sizeof(dp));
maxm=0;
for(i=0;i<n;i++)
{
scanf("%d%lf",&val[i],&p[i]);
p[i]=1-p[i];
maxm+=val[i];
}
dp[0]=1;
for(i=0;i<n;i++)
{
for(j=maxm;j>=val[i];j--)
dp[j]=Max(dp[j-val[i]]*p[i],dp[j]);
}
for(i=maxm;i>=0;i--)
if(1-dp[i]<pp)
break;
printf("%d\n",i);
}
return 0;
}