HDU 1203 I Need A Offer

来源:互联网 发布:站长源码下载 编辑:程序博客网 时间:2024/06/05 19:06

原题链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1203

题目大意:

《中文题》

思路:

要求至少拿到一份Offer的概率。那么根据高中知识只需要用 1-P(都拿不到Offer)就是所要求的概率。
在状态转移方程中要注意。两个事件是都要发生所以概率是用乘算而不是加算。

代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct I{    int cost;    double p;}s[10005];double dp[10000];int main(){    int n,m;    while( ~scanf("%d %d",&n,&m) )    {        if( n == 0 && m == 0 ) break;        int i;        for( i = 0; i < m; i++ )        {            scanf("%d %lf",&s[i].cost,&s[i].p );            //将输入的拿到Offer的概率转换成拿不到的概率            s[i].p = 1 - s[i].p ;        }        for( i = 0; i <= n; i++ )            dp[i] = 1.0;        int j;        for( i = 0; i < m; i++ )            for( j = n; j >= s[i].cost ; j-- )            //要求拿到Offer的概率最大。所以拿不到的概率要最小                dp[j] = min( dp[j],dp[j-s[i].cost ]*s[i].p );        //最后输出的时候要记得用1去减        printf("%.1lf%%\n",(1 - dp[n] )*100);    }    return 0;}
0 0
原创粉丝点击