HDU 1203 I NEED A OFFER!(01 背包DP)

点我看题目

题意 : 中文题不详述。

思路 :类似于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

 

你可能感兴趣的:(HDU)