Robberies

算法学习—–动态规划初探

题意分析

有一个小偷去抢劫银行,给出来银行的个数n,和一个概率p为能够逃跑的临界概率,接下来有n行分别是这个银行所有拥有的钱数mi和抢劫后被抓的概率pi,求在不被抓的情况下,小偷能抢到的最多的钱是多少。

显然这是一道概率问题,计算小偷不能逃的概率是不好算的,不如计算他成功的概率。若把题目中每个数据变成能够逃跑的概率,那就是1-pi。

我们先举个简单的例子.

不妨假设有3个银行:

①如果小偷都能抢劫,那么抢劫后能逃跑的概率就是(1-p1) * (1-p2) * (1-p3),对应抢到的金钱就是m1+m2+m3

②若他只能抢劫其中2个,那么就是有下面3种情况

~ case1 case 2 case3
成功概率 (1-p1) * (1-p2) (1-p1) * (1-p3) (1-p2) * (1-p3)
获得金钱 m1+m2 m1+m3 m2+m3

③若他只能抢劫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 105
using 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背包+概率问题)的更多相关文章

  1. HDOJ 2955 Robberies (01背包)

    10397780 2014-03-26 00:13:51 Accepted 2955 46MS 480K 676 B C++ 泽泽 http://acm.hdu.edu.cn/showproblem. ...

  2. hdu 2955 Robberies 0-1背包/概率初始化

    /*Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. hdu 2955 Robberies (01背包)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 思路:一开始看急了,以为概率是直接相加的,wa了无数发,这道题目给的是被抓的概率,我们应该先求出总的 ...

  4. HDU 2955 Robberies(01背包变形)

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. hdu 2955 Robberies (01背包好题)

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. HDU——2955 Robberies (0-1背包)

    题意:有N个银行,每抢一个银行,可以获得\(v_i\)的前,但是会有\(p_i\)的概率被抓.现在要把被抓概率控制在\(P\)之下,求最多能抢到多少钱. 分析:0-1背包的变形,把重量变成了概率,因为 ...

  7. HDU 2955 Robberies --01背包变形

    这题有些巧妙,看了别人的题解才知道做的. 因为按常规思路的话,背包容量为浮点数,,不好存储,且不能直接相加,所以换一种思路,将背包容量与价值互换,即令各银行总值为背包容量,逃跑概率(1-P)为价值,即 ...

  8. HDU 2955 Robberies(01背包)

    Robberies Problem Description The aspiring Roy the Robber has seen a lot of American movies, and kno ...

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

    Robberies  HDU2955 因为题目涉及求浮点数的计算:则不能从正面使用01背包求解... 为了能够使用01背包!从唯一的整数(抢到的钱下手)... 之后就是概率的问题: 题目只是给出被抓的 ...

随机推荐

  1. package.json中的devDependencies和dependencies有啥区别?

    如果你的项目是发布到npm的一个包, 那么这个包的package.json中的dependencies中的依赖是会被下载下来到这个包的node_modules文件夹中的(如果你的项目本身没有这个依赖) ...

  2. python基础之变量和简单数据类型

    1.1 变量的命名和使用规范 变量名可以包含数字.字母.下划线,但是不能以数字开头. 变量名不能包含空格,可使用下划线来分割其中的单词. 不要将Python关键字和函数名用作变量名. 变量名应既简短又 ...

  3. Python 作用域和命名空间

    在介绍类之前,我首先要告诉你一些Python的作用域规则.类定义对命名空间有一些巧妙的技巧,你需要知道作用域和命名空间如何工作才能完全理解正在发生的事情.顺便说一下,关于这个主题的知识对任何高级Pyt ...

  4. LabVIEW初篇---前言

    最早接触labview,是研二的时候,2007年,当时为了补贴家用,改善生活.自己拿着本科毕业证去找工作,去一个企业面试,当时,面试的主考官,问了会什么吗,比如PLC.单片机啥的?那时候的自己,基本上 ...

  5. [CodeForce455A]Boredom

    题面描述 Alex doesn't like boredom. That's why whenever he gets bored, he comes up with games. One long ...

  6. 下拉网页div自动浮在顶部

    <!DOCTYPE html> <html> <head> <title></title> <style type="tex ...

  7. Flex 布局浅析

    除了 CSS 中传统的布局系统之外,CSS3还提供了一个新布局系统.在这个新的框模型中,框的子代采用水平或垂直布局,而且可将未使用的空间分配给特定的子代,或者通过“弹性”分配给应展开的子代,在各子代间 ...

  8. django request bug

    bug描述:django请求request接收数据时,如果参数中包含分号时,会导致分号后面的消息丢失. 比如前台js调用代码 $.post('/get_params', { "A" ...

  9. 关于excle导数据的一些代码笔记

    package com.bonc.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutpu ...

  10. NMAP-主机扫描

    1.全面扫描 2.扫描指定段 3.ping扫描 只进行ping操作,十分隐蔽 4.无ping扫描 适用于防火墙禁止ping 5.TCP SYN扫描 6.TCP ACK扫描 7.UDP扫描 8.ICMP ...