1 0.1 2 0.1 0.4
10.000 10.500
题意:
有N(1<=N<=20)张卡片,每包中含有这些卡片的概率为p1,p2,````pN.每包至多一张卡片,可能没有卡片。求需要买多少包才能拿到所以的N张卡片,求次数的期望。
可以用容斥原理做。也可以状态压缩进行概率DP,期望DP
容斥原理代码:
/* ***********************************************
Author :rabbit
Created Time :2014/4/2 10:48:24
File Name :13.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
double p[30];
int main(){
int n;
while(cin>>n){
for(int i=0;i<n;i++)cin>>p[i];
double ans=0;
for(int i=1;i<(1<<n);i++){
double ss=0;int cnt=0;
for(int j=0;j<n;j++)
if((1<<j)&i){
ss+=p[j];
cnt++;
}
if(cnt%2)ans+=1.0/ss;
else ans-=1.0/ss;
}
printf("%.5lf\n",ans);
}
}
/* ***********************************************
Author :rabbit
Created Time :2014/4/2 10:48:24
File Name :13.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
double dp[1<<23],p[23];
int main(){
int n;
while(cin>>n){
double tt=0;
for(int i=0;i<n;i++)cin>>p[i],tt+=p[i];
tt=1-tt;
dp[(1<<n)-1]=0;
for(int i=(1<<n)-2;i>=0;i--){
double x=0,sum=1;
for(int j=0;j<n;j++){
if(i&(1<<j))x+=p[j];
else sum+=p[j]*dp[i|(1<<j)];
}
dp[i]=sum/(1-tt-x);
}
printf("%.5lf\n",dp[0]);
}
return 0;
}HDU 4336 概率dp或者容斥原理,布布扣,bubuko.com
原文:http://blog.csdn.net/xianxingwuguan1/article/details/22788169