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 }

你可能感兴趣的:(HDU)