概率DP期望,逆推即可。使用状态压缩。
注意,要全部输出。。。看DIS才发现题目输出是个坑。。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; double state[(1<<20)+10]; double ps[25]; int main(){ int n; double noted,is; while(scanf("%d",&n)!=EOF){ double fail=1; for(int i=0;i<n;i++){ scanf("%lf",&ps[i]); fail-=ps[i]; } int al=(1<<n)-1; for(int i=al;i>=0;i--){ if(i==al){ state[i]=0; continue; } noted=fail;is=1; for(int k=0;k<n;k++){ if(i&(1<<k)){ noted+=ps[k]; } else{ is+=(ps[k]*state[i|(1<<k)]); } } state[i]=is/(1-noted); } printf("%lf ",state[0]); } return 0; }