背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋);
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
int a[10000];
double f[10000],m,b[10000],v;
void init()
{
v=0;
scanf("%lf",&m);
m=1-m;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%lf",&a[i],&b[i]);
b[i]=1-b[i];
v+=a[i];
}
}
void work()
{
for(int i=1;i<=v;i++)
f[i]=0;
f[0]=1;
for(int i=1;i<=n;i++)
{
for(int k=v;k>=a[i];k--)
{
f[k]=max(f[k],f[k-a[i]]*b[i]);
}
}
for(int i=v;i>=0;i--)
{
if(f[i]-m>=0.000000001)
{
printf("%d\n",i);
break;
}
}
}
int main()
{
int times;
scanf("%d",×);
for(int i=1;i<=times;i++)
{
init();
work();
}
return 0;
}