题意:
给你n个卡片和这n个卡片获得的概率
求解收集全部卡片的期望
因为一共20个卡片可以利用状态压缩表示 0表示没收集 1表示 已经收集了
ACcode:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
double dp[1<<21];
double p[22];
double DP(int n,double t){
dp[(1<<n)-1]=0;
for(int i=(1<<n)-2;i>=0;--i){
double sum1=0,sum2=1;
for(int j=0;j<n;++j){
if(i&(1<<j)) sum1+=p[j];///判断1~n个卡片在这个状态前是否收集到了
else sum2+=p[j]*dp[i|(1<<j)];///没有就计算收到的概率
}
dp[i]=sum2/(1-sum1-t);
}
return dp[0];
}
int main(){
int n;
while(~scanf("%d",&n)){
double t=1;
for(int i=0;i<n;++i){
scanf("%lf",&p[i]);
t-=p[i];
}
printf("%.5f\n",DP(n,t));
}
return 0;
}