博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1203 I NEED A OFFER! (dp)
阅读量:4451 次
发布时间:2019-06-07

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

Problem Description

Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了。要申请国外的任何大学,你都要交纳一定的申请费用,这可是很惊人的。Speakless没有多少钱,总共只攒了n万美元。他将在m个学校中选择若干的(当然要在他的经济承受范围内)。每个学校都有不同的申请费用a(万美元),并且Speakless估计了他得到这个学校offer的可能性b。不同学校之间是否得到offer不会互相影响。“I NEED A OFFER”,他大叫一声。帮帮这个可怜的人吧,帮助他计算一下,他可以收到至少一份offer的最大概率。(如果Speakless选择了多个学校,得到任意一个学校的offer都可以)。

 

Input

输入有若干组数据,每组数据的第一行有两个正整数n,m(0<=n<=10000,0<=m<=10000) 

后面的m行,每行都有两个数据ai(整型),bi(实型)分别表示第i个学校的申请费用和可能拿到offer的概率。 

输入的最后有两个0。

 

Output

每组数据都对应一个输出,表示Speakless可能得到至少一份offer的最大概率。用百分数表示,精确到小数点后一位。

 

Sample Input

10 34 0.14 0.25 0.30 0

 

Sample Output

44.0%HintYou should use printf("%%") to print a '%'.

分析:

本题用到的是1背包的思想,只不过是用的逆向思维,题目要求求出至少一份的概率,那就求它的反面,一份也得不到的概率,进而求出至少一份的概率

代码:

#include
#include
#include
#include
using namespace std;int main(){ int n,m; while(~scanf("%d%d",&n,&m)&&n+m) { int a[10003],i; double b[10003],c[10003]; for(i=0; i<=n; i++) c[i]=1.0; for(i=1; i<=m; i++) { scanf("%d",&a[i]); scanf("%lf",&b[i]); } for(int i = 1; i <=m; i++) { for(int j = n; j >= a[i]; j--) c[j] = min(c[j],c[j-a[i]]*(1.0-b[i])); } double cc=1.0-c[n]; printf("%.1lf%%\n",cc*100); } return 0;}

转载于:https://www.cnblogs.com/cmmdc/p/6766996.html

你可能感兴趣的文章
hdu 4043
查看>>
hdu 1506
查看>>
PowerShell创建 Profile
查看>>
MySQL+Altas 读写分离测试(Altas 不能用存储过程,Update和Delete必须要有参数)
查看>>
Spring声明式事务管理基于tx/aop命名空间
查看>>
元素float以后,div高度无法自适应解决方案
查看>>
redis持久化 RDB和AOF
查看>>
回到顶部按钮
查看>>
HTML5的新结构标签
查看>>
非windows下 php连接mssql FreeTDS配置
查看>>
面试技术资料收藏
查看>>
RedHat Enterprise Linux 5下安装JDK
查看>>
合理的代码覆盖率
查看>>
【转】2014区域赛小结(牡丹江&&鞍山)by kuangbin
查看>>
光标跟随
查看>>
2/24笔记
查看>>
纯真的间谍
查看>>
paramiko上传下载
查看>>
【转】C#各个版本中的新增特性详解
查看>>
localstorage 使用
查看>>