解题思路
第一种方法是状压\(dp\),设\(f(S)\)为状态\(S\)到取完的期望步数,那么\(f(S)\)可以被自己转移到,还可以被\(f(S|(1<<i))\)转移到,\(i\)为\(S\)中没有的一个元素。
第二种方法是\(Min-Max\)反演,要求的其实就是\(max(S)\),反演得\(max(S)=\sum\limits_{T\subseteq S}min(T)\),而\(min(T)=\sum p(i)\)(\(i\)是\(T\)的子集)。代码
状压
#include#include #include #include #include using namespace std;const int N=20;int n;double p[N+2],ans,f[(1<
\(Min-Max\)反演
#include#include #include using namespace std;const int N=22;int n;double ans,p[N];int main(){ while(~scanf("%d",&n)){ ans=0; for(int i=1;i<=n;i++) scanf("%lf",&p[i]); for(int S=1;S<(1<