一道条件概率题,数学烂真的伤不起,一开始都不知道怎么求条件概率。
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; }
【UVA】11181 - Probability|Given(条件概率)
时间: 2024-12-28 00:26:47