zoukankan      html  css  js  c++  java
  • HDU 1203 I NEED A OFFER!(dp)

    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 '%'.




    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    #include<queue>
    #include<stack>
    #include<vector>
    using namespace std;
    
    #define N 10005
    
    double dp[N],p[N];
    int n,m,cost[N];
    
    int main()
    {
    	int i,j;
    	while(scanf("%d%d",&n,&m),n+m)
    	{
    		for(i=0;i<=n;i++)
    			dp[i]=1;
    		for(i=0;i<m;i++)
    			scanf("%d%lf",&cost[i],&p[i]);
    
    		for(i=0;i<m;i++)
    			for(int v=n;v>=cost[i];v--)
    			dp[v]=min(dp[v],dp[v-cost[i]]*(1-p[i]));//求不被录取的概率的最小值
    		printf("%.1lf%%
    ",(1-dp[n])*100);
    	}
     return 0;
    }
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    第36课 经典问题解析三
    第35课 函数对象分析
    67. Add Binary
    66. Plus One
    58. Length of Last Word
    53. Maximum Subarray
    38. Count and Say
    35. Search Insert Position
    28. Implement strStr()
    27. Remove Element
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4604061.html
Copyright © 2011-2022 走看看