#min_max容斥#Hdu 4336 Card Collector

题目

(n)张牌,获得第(i)张牌的概率为(p_i)
问期望多少次能收集完(n)张牌


分析

题目求的是(E(max S)),根据min_max容斥可以得到,

[E(max S)=sum_{Tsubseteq S}(-1)^{|T|-1}E(min T) ]

然而

[E(min S)=frac{1}{sum_{jin S}p_j} ]

所以搜索一下就可以了


代码

#include <cstdio>
#define rr register
using namespace std;
int n; double p[21],ans;
inline void dfs(int dep,double sum,int opt){
	if (dep>n) {if (sum>1e-6) ans-=opt/sum; return;}
	dfs(dep+1,sum,opt);
	dfs(dep+1,sum+p[dep],-opt);
}
signed main(){
	while (scanf("%d",&n)==1){
		for (rr int i=1;i<=n;++i) scanf("%lf",&p[i]);
		ans=0,dfs(1,0,1),printf("%lf
",ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Spare-No-Effort/p/14081749.html