题意:有几组测试用例,第一个小数,表示抢劫犯被抓的概率p,第二个数N表示下面有N个银行,下面N行,每行第一个数表示银行有多少钱,第二个数表示能抓住抢劫犯的概率。求在不被抓住的情况下能抢到最多的钱
解析:求反概率,即不被抓住的概率
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=10009;
float dp[maxn];
float pp,p[maxn];
int cost[maxn];
int t,n;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%f%d",&pp,&n);
memset(dp,0,sizeof(dp));
pp=(1-pp);
int sum=0;
for(int i=0;i<n;i++)
{scanf("%d%f",&cost[i],&p[i]);
p[i]=(1-p[i]);
sum+=cost[i];
//printf("%d %f\n",cost[i],p[i]);
}
dp[0]=1.0;
for(int i=0;i<n;i++)
for(int j=sum;j>=cost[i];j--)
{dp[j]=max(dp[j],dp[j-cost[i]]*p[i]);
}
int i;
for(i=sum;i>=0;i--)
if(dp[i]>=pp)
break;
printf("%d\n",i);
}
return 0;
}