标签:
http://acm.hdu.edu.cn/showproblem.php?pid=4336
1 0.1 2 0.1 0.4
10.000 10.500
/**
hdu 4336 概率dp、状态压缩dp
题目大意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率为p1,p2,````pN.
           每包至多一张卡片,可能没有卡片。
           求需要买多少包才能拿到所以的N张卡片,求次数的期望。
解题思路:状态压缩求概率。
           dp[(1<<n)-1]=0,dp[i]=(sum(dp[i|(1<<j)]*a[j])+1)/(sum(a[j]));j为所有j&(1<<i)==0,dp[0]即为所求
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
double a[30],dp[(1<<20)+3];
int main()
{
    while(~scanf("%d",&n))
    {
        double ans=1.0;
        for(int i=0;i<n;i++)
        {
            scanf("%lf",&a[i]);
            ans-=a[i];
        }
        int maxx=(1<<n)-1;
        dp[maxx]=0.0;
        for(int i=maxx-1;i>=0;i--)
        {
            double cnt=0,sum=1;
            for(int j=0;j<n;j++)
            {
                if(i&(1<<j)) cnt+=a[j];
                else   sum+=dp[i|(1<<j)]*a[j];
            }
            dp[i]=sum/(1-cnt-ans);
        }
        printf("%.5lf\n",dp[0]);
    }
    return 0;
}
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/43488601