您的位置:首页 > 其它

UVA 11181(数学概率)

2015-05-08 20:58 471 查看
有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息