题意: 题目给出了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;
}