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
原文地址:https://www.cnblogs.com/ctyakwf/p/12670126.html