一道条件概率题,数学烂真的伤不起,一开始都不知道怎么求条件概率。
P(e) = p(e|E)/p(E).
用e出现的情况的概率,除以所有情况出现的概率,递归枚举每个人是否买东西了。
14026058 | 11181 | Probability|Given | Accepted | C++ | 0.102 | 2014-08-12 08:25:51 |
效率可能有点差。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<cmath>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;
#define _PI acos(-1.0)
#define INF (1 << 10)
#define esp 1e-6
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================
===========================================*/
#define MAXD 20 + 5
int n,m;
double p[MAXD];
double Sum ;
double _sum[MAXD];
int vis[MAXD];
bool Input(){
scanf("%d%d",&n,&m);
if(!n && !m)
return false;
for(int i = 0 ; i < n ; i++)
scanf("%lf",&p[i]);
return true;
}
void dfs(int cur, int key ,int now,double value){
if(key == 1){ /*这个人买东西了*/
value = value * p[cur];
vis[cur] = 1; /*表示这个人买东西了*/
}
else{
value = value * (1 - p[cur]);
vis[cur] = 0;
}
if(cur == n - 1){
if(now == m){
Sum += value;
for(int i = 0 ; i < n ; i++)
if(vis[i])
_sum[i] += value;
}
return ;
}
if(now < m)
dfs(cur + 1, 1 , now + 1 , value); /*假设下一个人买东西了*/
dfs(cur + 1, 0 , now , value); /*假设下一个人没买东西*/
return ;
}
int main(){
int Case = 1;
while(Input()){
Sum = 0;
memset(_sum,0,sizeof(_sum));
memset(vis,0,sizeof(vis));
dfs(0,0,0,1);
dfs(0,1,1,1);
printf("Case %d:\n",Case ++);
for(int i = 0 ; i < n ; i++){
double ans = _sum[i] / Sum;
printf("%.6f\n",ans);
}
}
return 0;
}