hdu 4336 Card Collector 容斥原理 多校联合赛(四) 第六题

看了hdu上的题解之后了解 原来是容斥原理,顺便复习了一下

每个bag中什么卡的机会都有,说明每个概率都会有交集,这样就会想到一个图,就是右下面那个

然后就这哥公式了,还是很好理解的

    
下面是我的一个dfs

#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;
        }
        printf("%lf\n",sum);
    }
}


  

  

你可能感兴趣的:(hdu 4336 Card Collector 容斥原理 多校联合赛(四) 第六题)