Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 16775 Accepted Submission(s):
6187

#include<stdio.h>
#include<string.h>
const int N=101;
float p[N],dp[N*100],pn;
int v[N],sum;
int main()
{
int T,n,res;
scanf("%d",&T);
while(T--)
{
scanf("%f%d",&pn,&n);sum=0;
pn=1-pn;//由于pn是可以承担的最大风险值 则1-pn为最低要达到的逃跑成功率
memset(dp,0,sizeof(dp));
for(int i=0;i<n;++i)
scanf("%d%f",&v[i],&p[i]),sum+=v[i],p[i]=1-p[i];
dp[0]=1;//不抢劫的时候逃跑成功率为1
for(int i=0;i<n;++i)
for(int j=sum;j>=v[i];--j)
if(dp[j-v[i]]*p[i]>dp[j])//成功率是乘法计算的
dp[j]=dp[j-v[i]]*p[i];
res=0;
for(int i=sum;i>=0;--i)
if(dp[i]>=pn)//只要成功率大于pn i即为要求的答案
{
res=i;
break;
}
printf("%d\n",res);
}
}
原文:http://www.cnblogs.com/-locker-/p/4809986.html