题目链接:https://cn.vjudge.net/problem/HDU-2955

题意

突然想找几个银行抢钱。

给出各银行的钱数和被抓的概率,以及能容忍的最大被抓概率。

问他最多能抢到多少钱?

思路

很好的一道题,受益良多。

  1. 代价是浮点数,不易存储计算。

    考虑到背包函数dp[cost]=val是个单调的,理论上自变量和因变量没有区别,可以位置互换。

    这样有函数: $ dp^-1[val]=cost $
  2. 可以发现本题代价的计算不是简单的加法,而是乘法关系。

    如果令dp为被抓的概率,有:dp[j]=max(dp[j], (1-dp[j-val[i]])cost[i]);

    但这样的边界难以给定

    如果令dp为逃脱的概率,有:dp[j]=max(dp[j], dp[j-val[i]]
    (1-cost[i]));

    边界即为dp[0]=1

    最后的输出解只需由大到小查dp数组即可,详细见代码。

提交过程

WA 变量没有互换,只是简单的把浮点数乘因子,转成整数

AC

代码

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e5+20;
const double eps=1e-8;
double cost[maxn], total, dp[maxn];
int val[maxn], n;
bool equal(double a, double b){
return (a-b)<eps && (b-a)<eps;
} int main(void){
int T; scanf("%d", &T);
while (T--){
scanf("%lf%d", &total, &n); int sumval=0;
for (int i=1; i<=n; i++){
scanf("%d%lf", &val[i], &cost[i]);
sumval+=val[i];
} for (int i=0; i<=sumval; i++) dp[i]=0;
dp[0]=1;
for (int i=1; i<=n; i++){
for (int j=sumval; j>=val[i]; j--)
dp[j]=max(dp[j], dp[j-val[i]]*(1-cost[i]));
} int ans;
for (int i=sumval; i>=0; i--)
if (1-dp[i]<total || equal(1-dp[i], total)){
ans=i; break;
}
printf("%d\n", ans);
} return 0;
}
Time Memory Length Lang Submitted
31ms 1292kB 935 G++ 2018-08-20 21:48:58

HDU-2955 Robberies 浮点数01背包 自变量和因变量位置互换的更多相关文章

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

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意:一个抢劫犯要去抢劫银行,给出了几家银行的资金和被抓概率,要求在被抓概率不大于给出的被抓概率的情况下, ...

  2. HDU 2955 Robberies【01背包】

    解题思路:给出一个临界概率,在不超过这个概率的条件下,小偷最多能够偷到多少钱.因为对于每一个银行都只有偷与不偷两种选择,所以是01背包问题. 这里有一个小的转化,即为f[v]代表包内的钱数为v的时候, ...

  3. HDU 2955 Robberies (01背包,思路要转换一下,推荐!)

    题意: 小A要去抢劫银行,但是抢银行是有风险的,因此给出一个float值P,当被抓的概率<=p,他妈妈才让他去冒险. 给出一个n,接下来n行,分别给出一个Mj和Pj,表示第j个银行所拥有的钱,以 ...

  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 变形较大的01背包(有意思,新思路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 Robberies Time Limit: 2000/1000 MS (Java/Others) ...

  6. Hdu 2955 Robberies 0/1背包

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

  7. hdu 2955(概率转化,01背包)

    Hot~~招聘——巴卡斯(杭州),壹晨仟阳(杭州),英雄互娱(杭州) (包括2016级新生)除了校赛,还有什么途径可以申请加入ACM校队? Robberies Time Limit: 2000/100 ...

  8. hdu 2955 Robberies(概率背包)

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

  9. hdu 2955 Robberies (01背包)

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

随机推荐

  1. JavaScript对原始数据类型的拆装箱操作

    JS中的基本类型: boolean null undefined string number symbol 每当读取一个基本类型的时候,会隐式的自动进行装箱操作(即:将一个基本类型变成对象): var ...

  2. WEBGL学习【九】立方体贴不同的纹理

    <html> <!--开始实现一个三维街景的渲染效果--> <head> <meta http-equiv="Content-Type" ...

  3. CentOS 笔记(六) 历史命令 自动补充

    history #出现历史的命令 #执行具体的一条历史命令 !458 ②安装自动补充功能 yum install -y bash-completion #输入命令 按Tab 会显示所有内容 syste ...

  4. OOA,OOD,OOP区别

    定义: OOA(Object-Oriented Analysis,面向对象分析方法) OOD(Object-Oriented Design,面向对象设计) OOP(Object Oriented Pr ...

  5. python简单post信息

    最近学了点关于python的网络爬虫的知识,简单记录一下,这里主要用到了requests库和BeautifulSoup库 Requests is an elegant and simple HTTP ...

  6. WebApi传参总动员(一)

    目前自己的工作和WebApi相关,免不了传入.接收参数.以前的老办法是从请求流中获取json,再反序列化,这中间有2个不能控制的地方,一个是流,一个是反序列化,都需要try,总感觉非常的不爽.因此对W ...

  7. [SharePoint2010开发入门经典]创建你的第一个SPS2010程序

    本章概要: 1.创建一个解决方案,使他能读写数据从列表中,使用服务器端对象模型和可视的web部件 2.使用VS2010构建部署解决方案 3.使用图标web部件渲染列表数据 4.在一个解决方案中集成不同 ...

  8. JavaWeb应用中的身份验证(声明式)——基于表单的身份认证

    容器管理安全最普遍的类型建立在基于表单的身份验证方式上. 通过这样的方式,server自己主动将尚未验证的用户重定向到一个HTML表单.检查他们的username和password,决定他们属于哪个角 ...

  9. robot framework框架selenium API

    RIDE面板认识 selenium API 关键字 语法 参数 备注 Open Browser url Chrome 用不同的浏览器打开url,需要下载不同的浏览器驱动,默认火狐 Close Brow ...

  10. 16进制颜色字符串转为UIColor

    //16进制颜色(html颜色值)字符串转为UIColor +(UIColor *) hexStringToColor: (NSString *) stringToConvert {      NSS ...