【HDU1203】I NEED A OFFER!

来源:互联网 发布:python sftp 断点续传 编辑:程序博客网 时间:2024/06/07 19:28

【题目简介】

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

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

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

输入的最后有两个0。

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

【输入样例】

10 3

4 0.1

4 0.2

5 0.3

0 0

【输出样例】

44.0%

【提示】

输出“%”用“printf(“%%”)”。

【分析&思路】

本题最难理解的是“概率”这个数学名词,我们可以将它比作一个黑暗的“社会”,你需要在里面交税,交税时,你需要经过一道道审核,审核官会偷你一些钱,最后你被偷的钱所占你交上去的钱的百分率就是“概率”。

拿样例来说吧:

假设我现在交了“100”的“税”,在第一道审核(即“学校”)时,被抽走了0.1的“税”,我还剩100 *(1 – 0.1)的“税”,即“90”,还剩下6万美元。

输出的来源:我在第二个学校和第三个学校“交税”,还剩下1万美元,被第二个学校抽走0.2的“税”,被第三个学校抽走0.3的“税”,实际上我交的“税”只有1*(1-0.2)*(1-0.3),

即“0.56”,在用最开始的“1”减去“0.56”,得到的结果*100即为答案:44

        所以,我们要使自己被收的“税”最多【我是不是有病】,然后就可以转化为一个01背包问题。

【代码&注释】

#include#includeusing namespace std;int main(){    int n,m,i,j;    while(scanf("%d%d",&n,&m) && n + m)//n + m即为结束条件    {        double f[10001];        fill(f,f+10001,0);//等价于memset(f,0,sizeof(f))或memset(f,0,sizeof(double) * 10001);        for(i = 1;i <= m;i++)//枚举学校        {            int a;            double b;            scanf("%d%lf",&a,&b);//输入学校情况            for(j = n;j >= 0;j--)//枚举                if(j >= a)//防止数组下标为负                    f[j] = max(f[j],1 - (1 - b) * (1 - f[j - a]));                    //上01背包,第二个参数的改变即为“我被偷走了钱”        }        printf("%.1lf%%\n", f[n]*100);//f[n]为答案存储的地方,*100输出即可    }    return 0;}

原题链接
原创粉丝点击