码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-04 21:33:29      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:

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

题目思路:从题目来看是很明显的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

 

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

标签:

原文地址:http://www.cnblogs.com/alan-W/p/5738166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!