点我看题目

题意 : 中文题不详述。

思路 :类似于01背包的DP,就是放与不放的问题,不过这个要求概率,至少得到一份offer的反面就是一份也得不到,所以先求一份也得不到的概率,用1减掉就可以得到所求。

//HDU 1203
#include <stdio.h>
#include <iostream>
using namespace std ;
struct node
{
    int a ;
    double b ;
}p[101000] ;
double dp[10100] ;
int main()
{
    int n,m ;
    while(~scanf("%d %d",&n,&m))
    {
        if(n == 0 && m == 0) break ;
        for(int i = 0 ; i < m ; i++)
            scanf("%d %lf",&p[i].a,&p[i].b) ;
        for(int i = 0 ; i <= n ; i++)
            dp[i] = 1 ;
        for(int i = 0 ; i < m ; i++)
        {
            for(int j = n ; j >= p[i].a ; j--)
                dp[j] = min(dp[j-p[i].a]*(1-p[i].b),dp[j]) ;
        }
        printf("%.1lf%%\n",(1-dp[n])*100) ;
    }
    return 0 ;
}
View Code

 

posted on 2014-04-04 13:18  枫、  阅读(171)  评论(0)    收藏  举报