典型的0-1背包的题,只不过把思路换了一下,把所有银行的钱看作是背包容量,单个的银行的钱看作重量,用f[]数组保存的是不被抓到的概率,最后扫描一下就行了.
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e4;
double p;
int t,n;
double f[maxn + 5];
double pj[105];
int mj[105];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lf%d",&p,&n);
int sum = 0;
for(int i = 1;i <= n;++i)
{
scanf("%d%lf",&mj[i],&pj[i]);
sum += mj[i];
}
memset(f,0,sizeof f);
f[0] = 1;
for(int i = 1;i <= n;++i)
{
for(int j = sum;j >= mj[i];--j)
f[j] = max(f[j],f[j - mj[i]] * (1 - pj[i]));
}
for(int i = sum;i >= 0;--i)
if(f[i] > (1 - p))
{
printf("%d\n",i);
break;
}
}
}