zoukankan      html  css  js  c++  java
  • UCF Local Programming Contest 2017 G题(dp)

    这道题的意思是给你n个物品,每个物品需要获得c个,单次这个物品获得的概率是p,问你最多有x次机会

    能够获得完这些物品的总概率是多少

    那么我么可以根据这道题推出状态的情况

    前i个物品用j次机会获得概率

    这样我们走两层循环就行,因为每次这个物品只有这次机会选中和没被这次机会选中两种可能

    所以根据这个情况更新一下答案就ok

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<map>
    #include<algorithm>
    #include<queue>
    #include<set>
    #define ull unsigned long long
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    typedef pair<int,pair<int,int> > plll;
    const int N=1e5+10;
    const int inf=0x3f3f3f3f;
    using namespace std;
    int c[N];
    double p[N];
    double f[2510][10010];
    int main() {
        int t;
        cin>>t;
        while(t--){
            int n;
            vector<double> num;
            int i;
            cin>>n;
            num.push_back(0);
            for(i=1;i<=n;i++){
                cin>>c[i]>>p[i];
            }
            for(i=1;i<=n;i++){
                while(c[i]--){
                    num.push_back(p[i]);
                }
            }
            int m;
            cin>>m;
            int j;
            for(i=0;i<=num.size();i++){
                for(j=0;j<=m;j++){
                    f[i][j]=0;
                }
            }
            f[0][0]=1;
            for(i=1;i<num.size();i++){
                for(j=1;j<=m;j++){
                   f[i][j]+=f[i-1][j-1]*num[i];
                   f[i-1][j]+=f[i-1][j-1]*(1.0-num[i]);
                }
            }
            double res=0;
            int k=num.size()-1;
            for(i=1;i<=m;i++){
                res+=f[k][i];
            }
            printf("%.3f
    ",res);
        }
    }
    View Code
  • 相关阅读:
    继承与 接口
    数组
    字符串加密
    类与对象
    java 方法学习
    课堂练习
    第一次课堂任务记录。整形数字相加合输出
    《大道至简》第二章 读后感
    大道至简第二章
    大道至简第一章
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12670126.html
Copyright © 2011-2022 走看看