按照解题报告的提示,用容斥原理实现
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
double gl[50],ans;
int n;
void solve(int bg,double sum,int flag,double &ans)
{
ans+=flag/sum;
for(int j=bg+1;j<n;j++)
solve(j,sum+gl[j],-1*flag,ans);
return;
}
int main()
{
int i,j,k;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%lf",&gl[i]);
ans=0;
for(i=0;i<n;i++)
{
solve(i,gl[i],1,ans);
}
printf("%f\n",ans);
}
return 0;
}
另解:概率dp,康哥指导的
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
double f[1<<21],gl[22];
int main()
{
int i,j,k,n;
double fz,fm;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%lf",&gl[i]);
f[(1<<n)-1]=0;
for(i=(1<<n)-2;i>=0;i--)
{
fz=1;fm=0;
for(k=0;k<n;k++)
{
if((i>>k&1)==0)
{
fz+=gl[k]*f[i|(1<<k)];
fm+=gl[k];
}
}
// printf("^ %f %f\n",fz,fm);
f[i]=fz/fm;
}
printf("%f\n",f[0]);
}
return 0;
}