这道题要求的是逃跑几率高于一开始给出的逃跑纪律,所以要用钱数做背包来求逃跑几率的最大值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
float dp[10000];
memset(dp,0,sizeof(dp));
dp[0]=1;
int n;
float total;
cin>>total>>n;
int m[100];
float p[100];
int sum=0;
for(int i=1;i<=n;i++){
cin>>m[i]>>p[i];
sum+=m[i];
}
for(int i=1;i<=n;i++)
{
for(int j=sum;j>=m[i];j--)
{
dp[j]=max(dp[j],dp[j-m[i]]*(1-p[i]));
}
}
for(int i=sum;i>=0;i--)
{
if(dp[i]>=1-total)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}