中文题
显然是要dp
dp[i][j] 考虑到 i 个 正面为j 个的概率
dp[i][j]= dp[i-1][j]*(1-p[i])+dp[i-1][j-1]*p[i];
j=0特判下

#include<cstdio> #include<cstring> #include<map> #include<iostream> #include<algorithm> #include<math.h> #include<map> #include<queue> #include<vector> using namespace std; #define ll long long #define MAXN 1010 double dp[MAXN][MAXN]; double z[MAXN]; int main() { int n,m; scanf("%d%d",&n,&m); dp[0][0]=1; double sum=1; for(int i=1;i<=n;i++) { scanf("%lf",&z[i]); } for(int i=1;i<=n;i++) { for(int j=0;j<=m;j++) { if(j==0) dp[i][j]=dp[i-1][j]*(1-z[i]); else dp[i][j]=dp[i-1][j]*(1-z[i])+dp[i-1][j-1]*z[i]; } // cout<<endl; } printf("%.4lf ",dp[n][m]); return 0; }