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.
InputThe 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 .OutputFor 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个银行和被抓的最大概率p。
下面n个银行,给的是能抢到的利润和被抓的概率。
要我们求的是在不被抓的情况下,能获得最大的利润,就是个01背包问题。
因为要求的是不被抓的概率,所以把背包问题的加法运算改成乘法运算就行了。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int M = 1111111; 6 double cost[M],bg[M]; 7 int wei[M]; 8 int main(){ 9 int t; 10 scanf("%d",&t); 11 while(t--){ 12 double p; 13 int n,sum=0; 14 memset(bg,0,sizeof(bg)); 15 scanf("%lf %d",&p,&n); 16 // printf("%d n",n); 17 for(int i=0;i<n;i++){ 18 scanf("%d %lf",&wei[i],&cost[i]); 19 sum+=wei[i]; 20 // printf("%d ",sum); 21 } 22 bg[0]=1.0; 23 for(int i=0;i<n;i++){ 24 for(int j=sum;j>=wei[i];j--){ 25 bg[j]=max(bg[j],bg[j-wei[i]]*(1.0-cost[i])); 26 } 27 } 28 for(int j=sum;j>=0;j--){ 29 // printf("%d ",j); 30 if(bg[j]>(1.0-p)){ 31 printf("%d ",j); 32 break; 33 } 34 } 35 } 36 return 0; 37 }