博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU - 2955
阅读量:6194 次
发布时间:2019-06-21

本文共 1517 字,大约阅读时间需要 5 分钟。

来源:https://vjudge.net/problem/HDU-2955

不好理解的 01背包 

关键 :用成功逃走的概率当做价值,银行的总钱数当做背包容量

 

思路:题目中给定价值和被抓几率,但是被抓几率不可以用乘积来组合计算,举个例子,比如第一个银行3%被抓几率,第二个5%被抓几率,那么乘起来会变成0.15%,抢的越多,被抓几率却越小了,显然不对,因此要转换成不被抓几率,上述例子则变为第一家97%不被抓,第二家95%不被抓,乘起来就是92.15%,抢的越多,不被抓的几率越来越小即被抓几率越来越大,这样才是符合常理的。

 

那么背包体积应该是什么呢?先看最普通01背包,用数个cost来填充V,使得value之和尽量大,那么这题就应该是用数个money填充总money,使得不被抓几率尽量大。那转移方程就是dp[j]=max(dp[j],dp[j-w]*c),这里和01背包的区别就是从+改成了*。然后得到dp数组是0~V情况下的不被抓几率的最优(大)值,这根答案有什么关系?逆序枚举每一种情况,若此情况下的dp值即不被抓几率大于等于题目中所给的不被抓几率,那就输出,逆序着从大到小枚举保证了找到的一个解是最优解。

#include 
#include
#include
#include
#include
using namespace std;double dp[10010];int a[110];double cost[110];int main(){ int t; scanf("%d",&t); while(t--) { double k; int n,sum = 0; scanf("%lf %d",&k,&n); k = 1 - k; memset(dp,0,sizeof(dp)),memset(cost,0,sizeof(cost)),memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) { scanf("%d %lf",&a[i],&cost[i]); cost[i] = 1.00 - cost[i]; sum += a[i]; } dp[0] = 1; for(int i=1;i<=n;i++) { for(int j=sum;j>=a[i];j--) { dp[j] = max(dp[j],dp[j-a[i]]*cost[i]); } } for(int i=sum;i>=0;i--) { if(dp[i] >= k) { printf("%d\n",i); break; } } } return 0;}

 

转载于:https://www.cnblogs.com/tonyyy/p/10785290.html

你可能感兴趣的文章
GlusterFS 安装与配置 分类: 软件插件学习 ...
查看>>
实验一 Java开发环境的熟悉境的熟悉
查看>>
(31)odoo中的时间
查看>>
利用Python实现“指尖陀螺”,让你释放压力
查看>>
JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(9):通过XML装配Bean
查看>>
Python学习开始
查看>>
WCF 安全性 之 自定义证书验证
查看>>
Eclipse之查找、替换操作
查看>>
Windows Azure 革新 – 欢迎来到VS2012
查看>>
在Azure HDInsight HBase集群中使用Thrift接口
查看>>
(转) springmvc @responsebody 字符编码修改
查看>>
软件工程学习进度表12
查看>>
3站立会议之个人
查看>>
迁移 Emacs 的自定义设置
查看>>
计算机中常用的命令
查看>>
爬虫中提取信息页链接的处理
查看>>
NHiberNate操作时的问题
查看>>
【待解决】maven创建web项目报错
查看>>
DataTime.Now.Ticks的应用
查看>>
通过表查询存储过程
查看>>