有抱负的罗伊·劫匪已经看过很多美国电影,他知道坏人通常会被抓住,经常是因为他们太贪心了。他决定在银行抢劫案中工作一段时间,然后退休后到一所大学从事一份舒适的工作。

题目:

罗伊去几个银行偷盗,他既想多投点钱,又想尽量不被抓到。已知各个银行的金钱数和被抓的概率,以及罗伊能容忍的最大被抓概率。求他最多能偷到多少钱?

思路:

背包问题

  • 原先想的是把概率当做背包,在这个范围内最多能抢多少钱。
    但是问题出在概率这里,一是因为概率是浮点数,用作背包必须扩大10^n倍来用。二是最大不被抓概率不是简单的累加。二是p = (1-p1)(1-p2)(1-p3) 其中p为最大不被抓概率,p1,p2,p3为各个银行被抓概率。

可行性上行不通

  • 第二次想到把银行的钱当做背包,把概率当做价值,总容量为所有银行的总钱数,求不超过被抓
    概率的情况下,最大的背包容量是多少
    dp[j] = max(dp[j],dp[j-Bag[i].v]*(1-Bag[i].p))(dp[j]表示在被抢概率j之下能抢的钱);

    代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; struct bag
{
int v;
double p;
}Bag[10010];
double dp[10010]; int main()
{
int T,N;
double p;
scanf("%d",&T);
while(T--)
{
scanf("%lf %d",&p,&N);
int sum = 0;
for(int i = 0; i < N; i++)
{
scanf("%d%lf",&Bag[i].v,&Bag[i].p);
sum += Bag[i].v;
}
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(int i = 0; i < N; i++)
{
for(int j = sum; j >= Bag[i].v; j--)
{
dp[j] = max(dp[j],dp[j-Bag[i].v]*(1-Bag[i].p));
}
} for(int i = sum; i >= 0; i--)
{
if(dp[i] > 1-p)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}

【题解】 hdu2955 Robberies的更多相关文章

  1. HDU2955 Robberies[01背包]

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

  2. hdu2955 Robberies(背包)

    https://vjudge.net/problem/HDU-2955 概率是浮点数,只能做值(而且这里是累乘,也不能化成整数),这里注意要化成安全概率(1-p[i]),求安全概率的最大值. 钱数作二 ...

  3. HDU-2955 Robberies 浮点数01背包 自变量和因变量位置互换

    题目链接:https://cn.vjudge.net/problem/HDU-2955 题意 突然想找几个银行抢钱. 给出各银行的钱数和被抓的概率,以及能容忍的最大被抓概率. 问他最多能抢到多少钱? ...

  4. hdu2955 Robberies  01背包+概率

    link:http://acm.hdu.edu.cn/showproblem.php?pid=2955 首先,这个题目的背包容量不能是概率.1.精度不清楚.2.把概率相加有什么意义呢?所以,转换一下, ...

  5. 01标题背包水章 HDU2955——Robberies

    原来是dp[i],它代表的不被抓的概率i这最大的钱抢(可能1-100) 客是dp[i]表示抢了i钱最大的不被抓概率,嗯~,弱菜水题都刷不动. 那么状态转移方程就是 dp[i]=max(dp[i],dp ...

  6. hdu2955 Robberies (01背包)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=2955">http://acm.hdu.edu.cn/showproblem.php ...

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

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

  8. Robberies(简单的01背包 HDU2955)

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

  9. 【hdu2955】 Robberies 01背包

    标签:01背包 hdu2955 http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意:盗贼抢银行,给出n个银行,每个银行有一定的资金和抢劫后被抓的概率,在 ...

随机推荐

  1. 在局域网内知道计算机的名字查找计算机的IP

    第一步 nbtstat -a 计算机名字 第二步 nbtstat -c 可以看到计算机地址

  2. HDU - 2091 空心三角形 水题,但是有点坑...

    空心三角形 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. Django(6)自定义路由转换器

    自定义路径转换器 有时候上面的内置的url转换器并不能满足我们的需求,因此django给我们提供了一个接口可以让我们自己定义自己的url转换器 django内置的路径转换器源码解析 在我们自定义路由转 ...

  4. 基于任务的异步编程(Task,async,await)

    这节讲一下比较高级的异步编程用法Task,以及两个异步关键字async和await. Task是在C#5.0推出的语法,它是基于任务的异步编程语法,是对Thread的升级,也提供了很多API,先看一下 ...

  5. Django(27)类视图

    类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...

  6. select 语句的基础语法

    授权语法sql 一.用户的创建与使用 在管理员登录后可创建用户 --创建qfplan用户-create user qfplan identified by qfplan; --用户基本权限授权gran ...

  7. Java 自定义常量

    Java 中的常量就是初始化或赋值后不能再修改,而变量则可以重新赋值. 我们可以使用Java 关键字 final 定义一个常量,如下 final double PI = 3.14; 注意:为了区别 J ...

  8. 关于STM32的可编程电压检测器的使用方法

    关于STM32的可编程电压检测器的使用方法 思维导图总览: 代码: 1 #include "sys.h" 2 #include "delay.h" 3 #inc ...

  9. 第一章 DevOps概述

    什么是软件开发 软件开发是根据用户要求建造出软件系统或者系统中的软件部分的过程. 软件开发是一项包括需求捕捉,需求分析,实现和测试的系统工程 软件开发有哪些困难? 软件开发的本质困难 复杂性 不可见性 ...

  10. 在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! <Spring 手撸专栏>目录 [x] 第 1 章:开篇介绍,我要带你撸 Spri ...