有n个人去超市,第i个人买东西的概率为p[i],逛完之后又r个人买了东西,求每个人实际买东西的概率。
条件概率公式的应用,具体分析见算法竞赛入门经典第二版p327
#include <stdio.h> #include <string.h> #include <cmath> #include <algorithm> using namespace std; const int maxn = 100 + 10; double p[maxn],a[maxn]; int n; double dfs(int cur,int lft,double pnow) { if(lft==0){ if(cur==n+1)return pnow; return dfs(cur+1,lft,pnow*(1-p[cur])); } if(n-cur+1<lft) return 0.0; double res = 0; double p1 = dfs(cur+1,lft-1,pnow*p[cur]); double p2 = dfs(cur+1,lft,pnow*(1.0-p[cur])); res = p1 + p2; a[cur] += p1; return res; } int main(int argc, char const *argv[]) { int r; for(int cas = 1; scanf("%d%d",&n,&r)==2; ++cas) { memset(a,0,sizeof a); if(n==0&&r==0)return 0; for(int i = 1; i <= n; i++) { scanf("%lf",p+i); } double tot = dfs(1,r,1.0); printf("Case %d:\n", cas); for(int i = 1; i <= n; i++)printf("%.6f\n", a[i]/tot); } return 0; }
时间: 2024-10-13 20:51:01