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