题目:http://acm.hdu.edu.cn/showproblem.php?pid=2955
题意:
给一个最大被抓概率P,和n个银行,给出每个银行的钱和被抓概率。
首先这是相互独立事件,我竟然将概率加起来了。。。
显然一贯的思维,将概率作为质量,钱看做价值是无法做的。
需要换种思路,将钱看做质量,希望被抓概率最小也就是逃跑概率最大,将逃跑概率看做价值即可。
然后得到每种可能的最大逃跑概率,大于1-P即可。
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=100005;
int a[105];
double p[105],dp[maxn];
int main(){
int n,t;
cin>>t;
while(t--){
memset(dp,0,sizeof(dp));
double P;
cin>>P>>n;
int sum=0;
for(int i=1;i<=n;i++){
cin>>a[i]>>p[i];
sum+=a[i];
}
dp[0]=1;
for(int i=1;i<=n;i++)
for(int j=sum;j>=1;j--)
dp[j]=max(dp[j],dp[j-a[i]]*(1-p[i]));
for(int i=sum;i>=0;i--){
if(dp[i]>=1-P){
cout<<i<<endl;
break;
}
}
}
return 0;
}