题意:给出总概率P,银行个数n。每个银行有价值vi,被抓概率pi。求被抓概率不大于P所抢到的最大价值。
由于这题的概率是小数。我们把概率看成价值,价值看成容量。di表示的是抢到价值时最大不被抓率。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define INF 1e11
#define N 11000
using namespace std;
int w[N];
double v[N],d[N];
int main()
{
int T,n;
double p;
cin>>T;
while(T--)
{
scanf("%lf%d",&p,&n);
int m=0,ans=0;
for(int i=0;i<n;i++)
{
scanf("%d%lf",&w[i],&v[i]);
m+=w[i];
}
memset(d,0,sizeof(d));
d[0]=1;
for(int i=0;i<n;i++)
for(int j=m;j>=w[i];j--)
d[j]=max(d[j],d[j-w[i]]*(1-v[i]));
for(int i=m;i>=0;i--)
if(d[i]>=1-p)
{
cout<<i<<endl;
break;
}
}
}