看了hdu上的題解之後了解 原來是容斥原理,順便復習了一下
每個bag中什麼卡的機會都有,說明每個概率都會有交集,這樣就會想到一個圖,就是右下面那個
然後就這哥公式了,還是很好理解的
下面是我的一個dfs
[cpp]
#include<iostream>
#include<cstdio>
using namespace std;
double s; int n,vis[25];
double a[25];
void dfs(int k,double sum,int cou,int j){
if(cou==k){
s+=1/sum;
return ;
}
for(int i=j;i<=n;i++){
sum+=a[i];
cou++;
dfs(k,sum,cou,i+1);
cou--;
sum-=a[i];
}
return ;
}
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%lf",&a[i]);
}
double sum=0;
for(int i=1;i<=n;i++)
sum+=(1/a[i]);
for(int i=2;i<=n;i++){
s=0;
dfs(i,0,0,1);
if(i%2==0) sum+=(-1)*s;
else sum+=s;
} www.2cto.com
printf("%lf\n",sum);
}
}
作者:youngyangyang04