hdu4336概率dp

买东西集齐全套卡片赢大奖。每个包装袋里面最多一张卡片,最少可以没有。且给了每种卡片出现的概率 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 ;
}



你可能感兴趣的:(hdu4336概率dp)