Robberies(HDU2955):01背包+概率转换问题(思维转换)

Robberies  HDU2955

 

因为题目涉及求浮点数的计算:则不能从正面使用01背包求解。。。

为了能够使用01背包!从唯一的整数(抢到的钱下手)。。。

之后就是概率的问题:

题目只是给出被抓的几率,如果同时抢两家银行的话,那么被抓的概率是:

(1-一家不被抓的概率*另一家不被抓的概率)

才是同时抢两家被抓的概率!

最后和题目给出的概率比较取较大值。。。

那么赋初值的时候dp[0]=1。

注意:不要误以为精度只有两位。

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 double n,b[105];
 7 double dp[10005];
 8 int a[105];
 9 int main()
10 {
11     int t,m,s,i,j;
12     scanf("%d",&t);
13     while(t--)
14     {
15         scanf("%lf%d",&n,&m);
16         n=1-n;
17         s=0;
18         for(i=0;i<m;i++)
19         {
20             scanf("%d%lf",&a[i],&b[i]);
21             s+=a[i];
22             b[i]=1-b[i];
23         }
24         memset(dp,0,sizeof(dp));
25         dp[0]=1;
26         for(i=0;i<m;i++)
27             for(j=s;j>=a[i];j--)
28                 dp[j]=max(dp[j],dp[j-a[i]]*b[i]);
29         for(j=s;j>=0;j--)
30             if(dp[j]-n>0.0000001)
31                 break;
32         printf("%d\n",j);
33     }
34     return 0;
35 }

 

posted on 2013-08-30 21:38  ~~碾压机  阅读(204)  评论(0编辑  收藏  举报