zoukankan      html  css  js  c++  java
  • hdu4336_容斥dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336

    题意:要集齐 n 张不同的卡片,给出每个卡片概率,问你集齐 n 张不同卡片要买卡片数量的期望

    首先这里概率是同时取得,与不同步取得的概率有区别,很多人思想就局限在这里。
    至少得到一张A卡的期望值+至少得到一张B卡的期望值-至少得到一张卡的期望值==至少能得到A卡和B卡的期望值,这是两张卡的情况,这里我重点分析一下这一种情况:如0.1 0.4,我们要想至少得到第一张卡,那么就要满足1/0.1=10,而如果想要至少得到第二张,就要满足1/0.4=2.5,有人会说如果我抽到了第一张卡,还剩下9张,可以分配给第二张取呀?说到这里,就要注意一点,这里是同时取总卡片,那个是单独取得,也就是你取得第一张卡的情况下面,取得第二张卡的概率,这是条件概率,是单独取得。我们这里是同时取得总卡片,我们现在取了1/10+1/0.4=12.5,而这里同时取得情况下,在10张里面含有A卡或B卡的期望值1/(0.1+0.4),在2.5张里面含有A卡或B卡的期望值为1/(0.1+0.4)=2,想一想这里含有A卡或B卡的分母为什么是1,因为我们求的是至少能得到A卡或B卡,考虑的都是至少,也就是取得期望最小值,所以是1. 那么: 1/0.1+1/0.4-(1/(0.1+0.4))==10.500;
    同理往下推到n,一样也可以,按照容斥原理,加奇减偶。
    往下推到n得到1/p1+1/p2+……+1/Pn-(1/(P1+P2)+1/(P2+P3)+……+1(Pn+P1))+1/(P1+P2+P3)+……+1/(P1+P2+P3)+……+1/(Pn-1+Pn+P1)+…………(-1)(n-1)/(p1+p2+P3+……+Pn);

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <vector>
     7 #include <cmath>
     8 #include <queue>
     9 #include <set>
    10 #include <map>
    11 #define INF 0x3f3f3f3f
    12 using namespace std;
    13 typedef long long LL;
    14 
    15 double p[25];
    16 int main()
    17 {
    18     int n;
    19     while(~scanf("%d", &n))
    20     {
    21         for(int i = 0; i < n; i++)
    22             scanf("%lf", &p[i]);
    23         double res = 0;
    24         for(int i = 1; i < (1 << n); i++)
    25         {
    26             int sum = 0;
    27             double te = 0;
    28             for(int j = 0; j < n; j++)
    29             {
    30                 if((1 << j) & i)
    31                 {
    32                     sum++;
    33                     te += p[j];
    34                 }
    35             }
    36             if(sum & 1)
    37                 res += 1.0 / te;
    38             else
    39                 res -= 1.0 / te;
    40         }
    41         printf("%lf
    ", res);
    42     }    
    43     return 0;
    44 }
    View Code
  • 相关阅读:
    小端大端
    位域
    c++ 2.1 编译器何时创建默认构造函数
    python 内置&&递归
    python返回值与局部全局变量
    python file
    python set
    python 字典的函数
    python FileError
    python pickle
  • 原文地址:https://www.cnblogs.com/luomi/p/5704294.html
Copyright © 2011-2022 走看看