Robberies

题意:一个强盗要去抢劫银行,对于每个银行来说,都有一个不被抓的概率p,和能抢劫到的钱数money,每个银行最多只可以被抢劫一次。问在不被抓的总概率P下,怎样得到最大价值的钱数。
分析:被抓概率可以转换成安全概率,Roy的安全概率大于1-P时都是安全的。抢劫的金额为0时,肯定是安全的,所以d[0]=1;其他金额初始为最危险的所以概率全为0;
注意:不要误以为精度只有两位。
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.
SampleInput
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
SampleOutput
2
4
6
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #define MAXN 101
 5 #define MAXV 10001
 6 
 7 using namespace std;
 8 
 9 int cost[MAXN];
10 double weight[MAXV],d[MAXV];
11 
12 int main()
13 {
14     int test,sumv,n,i,j;
15     double P;
16     cin>>test;
17     while(test--)
18     {
19         scanf("%lf %d",&P,&n);
20         P=1-P;
21         sumv=0;
22         for(i=0;i<n;i++)
23         {
24             scanf("%d %lf",&cost[i],&weight[i]);
25             weight[i]=1-weight[i];
26             sumv+=cost[i];
27         }
28         for(i=0;i<=sumv;i++)
29             d[i]=0;
30         d[0]=1;
31         for(i=0;i<n;i++)
32         {
33             for(j=sumv;j>=cost[i];j--)
34             {
35                 d[j]=max(d[j],d[j-cost[i]]*weight[i]);
36             }
37         }
38         bool flag=false;
39         for(i=sumv;i>=0;i--)
40         {
41             if(d[i]-P>0.000000001)
42             {
43                 printf("%d\n",i);
44                 break;
45             }
46         }
47     }
48     return 0;
49 }
View Code

 

posted @ 2015-10-19 10:21  Wei_java  阅读(379)  评论(0编辑  收藏  举报