这道题是给一个不被抓的概率,在不被抓的概率下每个银行都有 被抓概率,可获钱数,问最多获取钱数。
1. 每个银行的可被抓概率是相乘的
常规思考是乘一个数字扩大到整型,但是........
换个思路,即求每种钱数下最小的被抓概率,然后看哪个最大钱数下满足即可。
#include<stdio.h>
#include<string.h>
float f[10010];
int v;
void zopack(int money,float chance)
{
for(int i=v;i>=money;i--)
if(f[i]<f[i-money]*chance)
f[i]=f[i-money]*chance;
}
int main()
{
int money[110],i,n,m;
float chance[110],tol;
scanf("%d",&n);
while(n--)
{
scanf("%f%d",&tol,&m);
tol=1-tol;
for(i=0,v=0;i<m;i++)
{
scanf("%d %f",&money[i],&chance[i]);
chance[i]=1-chance[i];
v+=money[i];
}
memset(f,0,sizeof(f));
for(i=0,f[0]=1;i<m;i++)
zopack(money[i],chance[i]);
for(i=v;i>=0;i--)
if(f[i]>=tol)
{
printf("%d\n",i);
break;
}
}
}