码迷,mamicode.com
首页 > 其他好文 > 详细

【hdu2955】 Robberies 01背包

时间:2014-07-13 12:51:54      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   for   

标签:01背包

hdu2955 http://acm.hdu.edu.cn/showproblem.php?pid=2955

 

题意:盗贼抢银行,给出n个银行,每个银行有一定的资金和抢劫后被抓的概率,在给定一个概率P,表示盗贼愿意冒险抢劫所能承受的最大被抓概率。

思路:首先用1减去被抓概率,得到安全概率。那抢劫了多家银行后的安全概率就是这些银行各自的安全概率连乘起来。其实是01背包的变种,

  dp[j] 表示获得金额 j 时的安全概率。这里用滚动数组,得方程  dp[j] = max(dp[j], dp[i-a[i]]*(1-b[i])   其中a表示银行金额,b表示被抓概率。

trick:概率的精度不总是2

自WA点: 滚动数组的 j 要逆序遍历。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <vector>
 7 #include <map>
 8 #include <utility>
 9 #include <queue>
10 #include <stack>
11 #define N 105
12 #define REP(i,n) for(i=0;(i)<(n);i++)
13 using namespace std;
14 const int INF=1<<30;
15 const double eps=1e-6;
16 
17 double dp[N*N],b[N];
18 int n,a[N];
19 
20 void run()
21 {
22     int _;
23     scanf("%d",&_);
24     while(_--)
25     {
26         int sum=0,i,j;
27         double p;
28         memset(dp,0,sizeof(dp));
29         cin>>p>>n;
30         REP(i,n)
31         {
32             cin>>a[i]>>b[i];
33             sum+=a[i];
34         }
35         dp[0]=1.0;
36         REP(i,n)
37             for(j=sum;j>=a[i];j--)
38             {
39                 dp[j]=max(dp[j],dp[j-a[i]]*(1.0-b[i]));
40             }
41         for(i=sum;i>=0;i--)
42             if(dp[i]>=1.0-p)
43             {
44                 cout<<i<<endl;
45                 break;
46             }
47     }
48 }
49 
50 int main()
51 {
52 //    freopen("case.txt","r",stdin);
53     run();
54     return 0;
55 }

 

【hdu2955】 Robberies 01背包,布布扣,bubuko.com

【hdu2955】 Robberies 01背包

标签:style   blog   http   color   os   for   

原文地址:http://www.cnblogs.com/someblue/p/3840646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!