For a few months now, Roy has been assessing the security of various banks and the amount of cash they hold. He wants to make a calculated risk, and grab as much money as possible.
His mother, Ola, has decided upon a tolerable probability of getting caught. She feels that he is safe enough if the banks he robs together give a probability less than this.
Input
The first line of input gives T, the number of cases. For each scenario, the first line of input gives a floating point number P, the probability Roy needs to be below, and an integer N, the number of banks he has plans for. Then follow N lines, where line j gives an integer Mj and a floating point number Pj .
Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj .
Output
For each test case, output a line with the maximum number of millions he can expect to get while the probability of getting caught is less than the limit set.
Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.
Sample Input
3 0.04 3 1 0.02 2 0.03 3 0.05 0.06 3 2 0.03 2 0.03 3 0.05 0.10 3 1 0.03 2 0.02 3 0.05
Sample Output
2 4 6
题目大意:
给定一个浮点数和整数分别代表最低成功率,以及n户人家,接下来是n行人家的价值以及小偷被抓的概率,求不低于最低成功率能偷到的最大价值。
小偷成功的情况是都要成功,所以概率就是(1-p1)*(1-p2)....
#include <iostream> #include <cstring> using namespace std; double a[105],dp[10005],ans; int v[105]; int n; int main() { int T; cin>>T; while(T--) { memset(dp,0,sizeof dp); cin>>ans>>n; int maxn=0; for(int i=1;i<=n;i++) { cin>>v[i]>>a[i]; maxn+=v[i];///找到最大可能的得到价值 } dp[0]=1; for(int i=1;i<=n;i++) for(int j=maxn;j>=v[i];j--) dp[j]=max(dp[j],dp[j-v[i]]*(1-a[i])); for(int i=maxn;i>=0;i--) if(dp[i]>=(1-ans)) {cout<<i<<' ';break;} } return 0; }