HDOJ.2955 Robberies (01背包+概率问题)
来源:互联网 发布:无线访客网络设置 编辑:程序博客网 时间:2024/05/16 17:50
Robberies
题意分析
有一个小偷去抢劫银行,给出来银行的个数n,和一个概率p为能够逃跑的临界概率,接下来有n行分别是这个银行所有拥有的钱数mi和抢劫后被抓的概率pi,求在不被抓的情况下,小偷能抢到的最多的钱是多少。
显然这是一道概率问题,计算小偷不能逃的概率是不好算的,不如计算他成功的概率。若把题目中每个数据变成能够逃跑的概率,那就是1-pi。
我们先举个简单的例子.
不妨假设有3个银行:
①如果小偷都能抢劫,那么抢劫后能逃跑的概率就是(1-p1) * (1-p2) * (1-p3),对应抢到的金钱就是m1+m2+m3
②若他只能抢劫其中2个,那么就是有下面3种情况
③若他只能抢劫1个,那么他只有3中选择
④或者他一个都抢劫不了,那……
好了到这里就差不多理解题目的大意了。因为在概率里面,2件独立事情一起发生的概率是每个事件发生概率的乘积。(如果表述有不合理的地方,请各位留言指正)
我们接着看小偷,小偷面对每个银行,有偷或者不偷2种选择,这不就是典型的0/1背包问题的情景吗?那么限制小偷的偷东西的是什么呢?显然是他被抓的概率,同时小偷想获得最大价值的金钱,不妨我们做个对比:
背包容量(限制拿东西)-> 被抓概率(限制偷东西)
商品价值(希望最大) -> 金钱数量(希望最大)
到这里,大概就能看出来了,dp数组应该保存的是概率(开double类型),数组的下标代表所偷到的金钱。
下面仍有几点需要注意的(个人意见,仅供参考):
1.dp[0]要初始化为1,也很容易理解,啥都没有偷,被抓的概率为0,成功概率为100%;
2.dp完之后,应该由大到小遍历一遍,一旦有一种情况的成功概率大于等于(1-p) p为每组数据一开始给出来的那个临界,输出对应的金钱,break即可。
代码总览
/* Title:HDOJ.2955 Auhtor:pengwill Date:2016-12-18*/#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cstdlib>#define ma 105using namespace std;int m[ma];double dp[10000],p[ma];int main(){ //freopen("in.txt","r",stdin); int t; scanf("%d",&t); while(t--){ int n,i,j,sum = 0;double pmax; scanf("%lf %d",&pmax,&n); pmax = 1-pmax; memset(m,0,sizeof(m)); memset(p,0,sizeof(p)); for(i = 1;i<=n;++i){ scanf("%d %lf",&m[i],&p[i]); sum+=m[i]; p[i] = 1-p[i]; } memset(dp,0,sizeof(dp)); dp[0] =1; for(j = 1;j<=n;++j) for(i = sum;i>=m[j];--i) dp[i] = max(dp[i],dp[i-m[j]]*p[j]); for(i = sum;i>=0;--i) if(dp[i]>=pmax) break; printf("%d\n",i); } return 0;}
- HDOJ.2955 Robberies (01背包+概率问题)
- hdoj problem 2955 Robberies(01背包问题)
- HDOJ 2955 Robberies 简单01背包+简单概率思想
- hdoj Robberies 2955 (概率Dp&&01背包) 好题
- HDOJ 2955 Robberies (01背包)
- HDOJ 2955 Robberies (01背包)
- hdoj 2955 Robberies 【01背包】
- HDU 2955 Robberies(经典01背包概率问题)
- Robberies(01背包的概率问题)
- hdoj 2955Robberies<背包>
- HDOJ Robberies 01背包
- HDU-2955 Robberies 01背包 + 概率
- HDU 2955 Robberies(01背包+概率)
- HDU 2955|Robberies|01背包|概率
- hdoj 2955 Robberies【01背包】【dp】
- hdoj 2955 Robberies 【dp&&01背包】
- hdu2955 Robberies (01背包概率)
- HDOJ2955 Robberies(01背包,概率)
- Leetcode Total Hamming Distance 477
- css水平居中的方法
- 动态加载fragment配合TabLayout
- 设计模式之适配器模式
- Linux下tar用法
- HDOJ.2955 Robberies (01背包+概率问题)
- Tv Develop of Android TIF Study
- Linux下安装Nginx
- window平台安装 MongoDB
- 关于问题 mysql"Access denied for user root@localhost" 的解决办法
- JavaWeb之Jsp的初次相识
- 剑指offer 面试题57 删除链表中重复的结点
- 《React-Native系列》 API模块之PixelRatio和Dimensions
- DOM笔记