hdu2955 Robberies 01背包

题意:

Roy 去抢N个银行,去抢第j个银行时能得到Mj的钱,被抓的概率为Pj。

问在被抓的概率不大于P时能抢到的最多的钱是多少。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <map>
 4 #include <cstring>
 5 using namespace std;
 6 const int Ni = 110;
 7 int money[Ni];
 8 double dp[10100];
 9 double pro[Ni];
10 int dcmp(double a,double b)
11 {
12     if(a-b>1e-7) return 1;
13     if(b-a>1e-7) return -1;
14     return 0;
15 }
16 int main()
17 {
18     int t,n;
19     double p;
20     cin>>t;
21     while(t--)
22     {
23         scanf("%lf%d",&p,&n);
24         int sum=0;
25         for(int i=1;i<=n;i++)
26         {
27             scanf("%d%lf",money+i,pro+i);
28             sum+=money[i];
29         }
30         memset(dp,0,sizeof(dp));
31         dp[0]=1.0;
32         for(int i=1;i<=n;i++)
33         {
34             for(int j=sum;j>=money[i];j--)
35             {
36                 dp[j]=max(dp[j],dp[j-money[i]]*(1-pro[i]));
37             }
38         }
39         for(int i=sum;i>=0;i--)
40         {
41             if(dcmp(p,1-dp[i])!=-1)
42             {
43                 printf("%d\n",i);
44                 break;
45             }
46         }
47 
48     }
49     return 0;
50 }
posted @ 2012-08-13 08:38  qijinbiao1  阅读(199)  评论(0编辑  收藏  举报