这道题的意思是给你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); } }