原题:HDU 2955 Robberies
WA 80pts怀疑被卡精度
#include<bits/stdc++.h>
using namespace std;//80pts,WA on #6 #7
long long t,n,m[110],sum;
int ans;
double maxp,pi,p[110],f[1000100];
int main(){
cin>>t;
while(t--){
sum=0;
memset(f,0,sizeof(f));
cin>>maxp>>n;
for(int i=1;i<=n;i++){
cin>>m[i]>>pi;//m[i]是第i家银行能抢到的钱
p[i]=1.0-pi;//数组存每家银行安全的概率
sum=sum+m[i];
}
f[0]=1;
for(int i=1;i<=n;i++){
for(int j=sum;j>=m[i];j--){
f[j]=max(f[j],f[j-m[i]]*p[i]);// f[i]用来存在抢到i钱的情况下安全的概率
}
}
f[0]=1;
ans=0;
for(int i=sum;i>=0;i--){
if(1.0-f[i]<=maxp){//最终被抓的概率=1-每家抢过的银行的安全的概率相乘,这里如果是if(1-f[i]<maxp)则70pts,WA on #4 #6 #7
ans=max(ans,i);
break;
}
}
cout<<ans<<endl;
}
return 0;
}