版权声明:转就转吧~~记得声明噢~~ https://blog.csdn.net/Soul_97/article/details/82529447
概率DP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 100 + 5;
const int mod = 1e9 + 7;
const int MAXN=1E5+10;
const int MAXK=101;
int n,k;
double f[MAXN][MAXK],p[MAXN];
int main()
{
scanf("%d%d",&n,&k);
double Ans=0;
for(int i=1;i<=n;i++) scanf("%lf",&p[i]),Ans+=p[i];
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=k;j++)
f[i][j]=f[i-1][j]*(1-p[i])+(j?(f[i-1][j-1]*p[i]):0);
printf("%.4lf\n%.4lf\n",Ans,f[n][k]);
}
优化版
#include <bits/stdc++.h>
using namespace std;
double f[110];
double cnt;
int main()
{
int n, k;
scanf("%d%d", &n, &k);
f[0] = 1;
for (int i = 1; i <= n; i++)
{
double p;
scanf("%lf", &p);
cnt += p;
for (int j = k; j >= 1; j--)
f[j] = f[j] * (1 - p) + f[j - 1] * p;
f[0] *= (1 - p);
}
printf("%.4f\n", cnt);
printf("%.4f\n", f[k]);
return 0;
}