hdu4336概率dp

来源:互联网 发布:网络相亲可信吗 编辑:程序博客网 时间:2024/05/16 15:47

买东西集齐全套卡片赢大奖。每个包装袋里面最多一张卡片,最少可以没有。且给了每种卡片出现的概率 p[i],以及所有的卡片种类的数量 n(1<=n<=20),问集齐卡片需要买东西的数量的期望值。需要注意的是 包装袋中可以没有卡片.

        p(1) 没有卡片

        p(2) 卡片是已经收集到的

        p(3).卡片是没有收集到的

于是有:

        dp[s] = 1 + P(1)dp[s]) + P(2)dp[s] + (segma{ p[k]*f[s|(1<<k)] })

const int maxn = 20 ;double p[maxn+2] ;double dp[1<<maxn] ;int  main(){     int i , j , n  , s ;     double no , sum  , x ;     while(cin>>n){          no = 0.0 ;          for(i = 0 ; i < n ; i++){               scanf("%lf" , &p[i]) ;               no += p[i] ;          }          no = 1.0 - no ;          s = 1<<n ;          dp[s-1] = 0 ;          for(i = s-2 ; i >= 0 ; i--){               sum = 1.0 ;  x = 0.0  ;               for(j = 0 ; j < n ; j++){                    if(i & (1<<j))  x += p[j] ;                    else  sum += p[j] * dp[i^(1<<j)] ;               }               dp[i] = sum / (1-no-x) ;          }          printf("%.5lf\n" , dp[0]) ;     }     return 0 ;}



0 0
原创粉丝点击