HDU-2955 Robberies 浮点数01背包 自变量和因变量位置互换
题目链接:https://cn.vjudge.net/problem/HDU-2955
题意
突然想找几个银行抢钱。
给出各银行的钱数和被抓的概率,以及能容忍的最大被抓概率。
问他最多能抢到多少钱?
思路
很好的一道题,受益良多。
- 代价是浮点数,不易存储计算。
考虑到背包函数dp[cost]=val是个单调的,理论上自变量和因变量没有区别,可以位置互换。
这样有函数: $ dp^-1[val]=cost $ - 可以发现本题代价的计算不是简单的加法,而是乘法关系。
如果令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背包 自变量和因变量位置互换的更多相关文章
- HDU 2955 Robberies(0-1背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意:一个抢劫犯要去抢劫银行,给出了几家银行的资金和被抓概率,要求在被抓概率不大于给出的被抓概率的情况下, ...
- HDU 2955 Robberies【01背包】
解题思路:给出一个临界概率,在不超过这个概率的条件下,小偷最多能够偷到多少钱.因为对于每一个银行都只有偷与不偷两种选择,所以是01背包问题. 这里有一个小的转化,即为f[v]代表包内的钱数为v的时候, ...
- HDU 2955 Robberies (01背包,思路要转换一下,推荐!)
题意: 小A要去抢劫银行,但是抢银行是有风险的,因此给出一个float值P,当被抓的概率<=p,他妈妈才让他去冒险. 给出一个n,接下来n行,分别给出一个Mj和Pj,表示第j个银行所拥有的钱,以 ...
- hdu 2955 Robberies(01背包)
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 2955 变形较大的01背包(有意思,新思路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 Robberies Time Limit: 2000/1000 MS (Java/Others) ...
- Hdu 2955 Robberies 0/1背包
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 2955(概率转化,01背包)
Hot~~招聘——巴卡斯(杭州),壹晨仟阳(杭州),英雄互娱(杭州) (包括2016级新生)除了校赛,还有什么途径可以申请加入ACM校队? Robberies Time Limit: 2000/100 ...
- hdu 2955 Robberies(概率背包)
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 2955 Robberies (01背包)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 思路:一开始看急了,以为概率是直接相加的,wa了无数发,这道题目给的是被抓的概率,我们应该先求出总的 ...
随机推荐
- Win 10安装mysql以及常见问题总结
一.mysql免安装版本配置1.从官网下载安装包,解压后,在电脑属性环境变量的path中配置bin的路径 2.配置my.ini [mysql] # 设置mysql客户端默认字符集 default-ch ...
- MySQL基础:安装
概述 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户 ...
- GROUP BY GROUPING SETS 示例
--建表 create table TEst1 ( ID ), co_CODE ), T_NAME ), Money INTEGER, P_code ) ); --插入基础数据 insert into ...
- MVC笔记(一)
1 MVC介绍 MVC是一个编程思想. 是一种设计模式 思想: 将一个功能分解成3个部分, M: Model (模型) 处理数据相关的逻辑 V: View (视图) 显示页面 C: Controlle ...
- vscode快捷键(lua开发)
快速定位行:ctrl+g 查找:ctrl+f 格式化代码:ctrl+alt+f 快速查找到当前复制内容的第一次出现的位置ctrl+d 其他常用不一一列举了
- 模拟ArrayList底层实现
package chengbaoDemo; import java.util.ArrayList; import java.util.Arrays; import comman.Human; /** ...
- Redis,Memcache的区别和具体应用场景
1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个 ...
- Hadoop集群(第13期)_HBase 常用Shell命令
进入hbase shell console$HBASE_HOME/bin/hbase shell如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成功之 ...
- [Tailwind] Abstract Utility Classes to BEM Components in Tailwind
When creating UIs with utility classes, a lot of repetition can occur within the HTML markup. In thi ...
- ios基础-分辨率适配
(一)分辨率定义 分辨率,是指单位长度内包括的像素点的数量,它的单位通常为像素/英寸(ppi).描写叙述分辨率的单位有:(dpi点每英寸).lpi(线每英寸)和ppi(像素每英寸). (二)ios分辨 ...