标签:des style class blog code http
1 0.1 2 0.1 0.4
10.000 10.500
解题思路:有n个卡片,你现在买一包方便面,没包方便面出现其中一个卡片的概率为 p[i] ,问你集齐一套卡片需要的张数的数学期望。
概率DP,用位进制0表示这个卡片有了,1表示这个卡片还没有,那么 例如 “3” 用二进制表示 “1 1” 那么 数组 dp[3] 记录的就是 1号卡片和2号卡片都有的情况集齐一套卡片需要的张数的数学期望。
解题代码:dp[sum]= ( 1+sum { dp[ sum + (1<<j )] *p[j] } ) /sum{p[j] }
其中 ( i&(1<<j) )==0
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=(1<<20)+10;
int n;
double dp[maxn];
double p[30];
void solve(){
int sum=(1<<n)-1;
dp[sum]=0;
for(int i=sum-1;i>=0;i--){
double tmp=0;
dp[i]=1;
for(int j=0;j<n;j++){
if( ( i&(1<<j) )==0 ){
dp[i]+=dp[i+(1<<j)]*p[j];
tmp+=p[j];
}
}
dp[i]/=tmp;
}
printf("%lf\n",dp[0]);
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++) scanf("%lf",&p[i]);
solve();
}
return 0;
}
HDU 4336 Card Collector(动态规划-概率DP),布布扣,bubuko.com
HDU 4336 Card Collector(动态规划-概率DP)
标签:des style class blog code http
原文地址:http://blog.csdn.net/a1061747415/article/details/34481361