背包问题
转移方程:dp[j]=max(dp[j] , dp[j-value[i]] + cost[i] * (1 - dp[j-value]))
dp[j] -> 价值为j时的最大逃脱概率
#include "stdio.h"
#include "string.h"
#include "math.h"
int main()
{
int n,i,j,t,sum;
int value[101];
double m,cost[101],dp[100010];
scanf("%d",&t);
while (t--)
{
scanf("%lf%d",&m,&n);
sum=0;
for (i=1;i<=n;i++)
{
scanf("%d%lf",&value[i],&cost[i]);
sum+=value[i];
}
for (i=1;i<=sum;i++)
dp[i]=1;
dp[0]=0;
for (i=1;i<=n;i++)
for (j=sum;j>=value[i];j--)
if (dp[j-value[i]]+cost[i]*(1-dp[j-value[i]])<dp[j])
dp[j]=dp[j-value[i]]+cost[i]*(1-dp[j-value[i]]);
for (i=sum;i>=0;i--)
if (dp[i]<m)
{
printf("%d\n",i);
break;
}
}
return 0;
}