• 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%%
    ",(1-dp[n])*100);//【1-(不被任何大学录取的概率)】=至少被一个大学录取的概率
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    Six steps to create google map in the HTML5
    Vocabularies on vegetable, fruit, meat etc.
    常用的Windows命令
    sqlhelper
    素材
    sql sever 跨库查询
    在annotation中却会有ERROR: Duplicate entry
    一份Java学习路线图
    Java算法实例集合(2)
    Java编程规范实践
  • 原文地址:https://www.cnblogs.com/alan-W/p/5738166.html
Copyright © 2020-2023  润新知