I NEED A OFFER!

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 18054    Accepted Submission(s): 7237

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 3
4 0.1
4 0.2
5 0.3
0 0
 
Sample Output
44.0%
Hint
You should use printf("%%") to print a '%'.
 
Author
Speakless
 
Source
 
Recommend
 
题意:手里有n万元,这里有m所学校。想用n万元报学校拿到offer,m个学校都有一个申请费用和能得到offer的概率,问至少得到一个offer的最大概率是多少。
思路:首先解释一下例子:共10万元。3所学校(这里编号1,2,3)。得到offer概率最大的的情况是:报学校2和3,仅仅拿到学校1的offer,仅仅拿到学校3的offer。两个学校的offer都拿到。和=0.2*(1-0.3)+(1-0.2)*0.3+0.2*0.3=0.44.可是假设这样求的话非常麻烦,我们能够转化成求一个offer都拿不到的最小概率,那么此时的答案就是1-最小概率,转化成了01背包问题。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 10005
#define MAXN 2005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FRL(i,a,b) for(i = a; i < b; i++)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define DBG pf("Hi\n")
typedef long long ll;
using namespace std; //dp[i]表示花费i万元得不到offer的最小概率
double dp[maxn],p[maxn];
int n,m;
int w[maxn]; int main()
{
int i,j;
while (sff(n,m))
{
if (n==0&&m==0) break;
FRE(i,1,m)
{
scanf("%d%lf",&w[i],&p[i]);
p[i]=1.0-p[i]; //得不到的概率
}
FRL(i,0,n+1) //初始化为1.0
dp[i]=1.0;
FRE(i,1,m)
{
for (j=n;j>=w[i];j--)
dp[j]=min(dp[j],dp[j-w[i]]*p[i]);
}
pf("%.1lf%%\n",(1-dp[n])*100); //那么得到的最大概率就是1-dp[n]了
}
return 0;
}

I NEED A OFFER! (hdu 1203 01背包)的更多相关文章

  1. hdu 1203 01背包 I need a offer

    hdu 1203  01背包  I need a offer 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 题目大意:给你每个学校得到offe ...

  2. HDU 1203 01背包

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  3. HDU 1203 01背包变形题,(新思路)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1203 I NEED A OFFER! Time Limit: 2000/1000 MS (Java/ ...

  4. hdu 1203(01背包)被初始化坑惨了

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. hdu 1864 01背包 最大报销额

    http://acm.hdu.edu.cn/showproblem.php?pid=1864 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  6. hdu 2955 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 如果认为:1-P是背包的容量,n是物品的个数,sum是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...

  7. [HDOJ1171]Big Event in HDU(01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171 许多有价值的物品,有重复.问如何将他们分成两堆,使两堆价值之差最小. 对价值求和,转换成01背包 ...

  8. HDU 2639 01背包(分解)

    http://acm.hdu.edu.cn/showproblem.php?pid=2639 01背包第k优解,把每次的max分步列出来即可 #include<stdio.h> #incl ...

  9. HDU 1171 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=1171 基础的01背包,求出总值sum,背包体积即为sum/2 #include<stdio.h> # ...

随机推荐

  1. 引水工程 Kruskal + Prim

    Kruskal题解 : 以案例输入为例 有五个缺水地区 , 这个个缺水地区之间建立联系的费用已经给出 并且之间水库的费用也已经给出 , 自己水库也已看为 是另一个 点 , 这样就有了 6 个点 , 这 ...

  2. ios-判断手机上是否安装了某个App

    方法一     1.获取手机中安装的所有App   1.1.runtime中的方法,所以要导入       #include <objc/runtime.h>   1.2.在 AppDel ...

  3. 【转】linux下vi命令大全

    转自:http://www.cnblogs.com/88999660/articles/1581524.html 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi ...

  4. [转]c# 对密码执行散列和 salt 运算方法

    本文转自:http://www.cnblogs.com/CnBlogFounder/archive/2008/07/04/1235690.html 大家对密码执行散列和Salt运算一定不陌生.两个Vi ...

  5. 图解TCP/IP笔记(2)——数据链路

    [转载请注明]https://www.cnblogs.com/igoslly/p/9396066.html ——终端节点之间的包传递 MAC寻址(物理寻址).介质共享.非公有网络.分组交换.环路检测. ...

  6. (转)postgis常用函数介绍(二)

    http://blog.csdn.net/gisshixisheng/article/details/47903151 概述: 书接上文,本文继续讲解Postgres中常用的空间函数的使用. 常用函数 ...

  7. 零基础到精通Linux,从这篇文章开始

    2018年想做Linux运维的人应该如何学习才能快速精通Linux? Linux入门这么简单,为什么很多人学不会? 想要成为一个合格的运维工程师,到底怎么才能从零开始精通Linux? 作为一个运维小白 ...

  8. 【Flutter学习】基本组件之AppBar顶部导航栏

    一,概述 AppBar 显示在app的顶部.AppBar包含5大部分,如下图: 二,构造函数及参数含义 构造函数 AppBar({ Key key, this.leading, //在标题前面显示的一 ...

  9. Java-Class-Miniprogram:com.ylbtech.common.utils.miniprogram.TemplateMessage

    ylbtech-Java-Class-Miniprogram:com.ylbtech.common.utils.miniprogram.TemplateMessage 1.返回顶部 1.1. pack ...

  10. linq排序之 根据文本 A-001-002-003 这种类型进行分割排序 空值放于最后

    调用 List<string> data = new List<string>() { "D-001-001-001","A-001-004-00 ...