HDU 1203 I NEED A OFFER! 01背包 概率运算预处理。

题目大意:中问题就不说了 ^—^~

题目思路:从题目来看是很明显的01背包问题,被录取的概率记为v[],申请费用记为w[]。但是我们可以预先做个处理,使问题解决起来更方便:v[]数组保留不被录取的概率,则dp[j]则代表在j元费用下,不被录取的最低概率是多少,最后用1减去dp[n]即可。

dp式子为:dp[j]=min(dp[j],dp[j-w[i]]*v[i]); (j表示共有j元申请费用)。

 

详细看代码注释

#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define MAX 1000005
#define mod 1000000007

using namespace std;

int w[MAX];
double v[MAX],dp[MAX];

int main()
{
    int n,m,i,j;

    while(scanf("%d%d",&n,&m),n+m)
    {
        for(i=1;i<=m;i++)
        {
            scanf("%d%lf",&w[i],&v[i]);
            v[i]=1-v[i];//保留不被录取的概率
        }

        for(i=0;i<MAX;i++)
            dp[i]=1;

        for(i=1;i<=m;i++)
        {
            for(j=n;j>=w[i];j--)
            {
                dp[j]=min(dp[j],dp[j-w[i]]*v[i]);
            }
        }

        printf("%.1lf%%\n",(1-dp[n])*100);//【1-(不被任何大学录取的概率)】=至少被一个大学录取的概率
    }

    return 0;
}
View Code

 

posted @ 2016-08-04 19:37  声声醉如兰  阅读(122)  评论(0编辑  收藏  举报