您的位置:首页 > 其它

Probability|Given UVA - 11181

2017-05-23 19:42 155 查看

Probability|Given UVA - 11181

数学·概率

http://www.cnblogs.com/staginner/archive/2011/12/13/2286032.html

题目大意:

有n个人去超市买东西,给出r,每个人买东西的概率是p[i],当有r个人买东西的时候,第i个人恰好买东西的概率.

题解:

设事件B为一共有r个人买了东西,设事件Ai为第i个人买了东西。

那么这个题目实际上就是求P(Ai|B),而P(Ai|B)=P(AiB)/P(B),其中P(AiB)表示事件Ai与事件B同时发生的概率,同时总状态并不多,因此我们可以枚举买东西的状态预处理出P(AiB)和P(B),再代入计算即可。

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 21;

int bitcnt(int S){
int cnt=0;
for(int i=0;(1<<i)<=S;i++){
if(S&(1<<i)) cnt++;
}
return cnt;
}

int main(){
freopen("a.in","r",stdin);
int cas=0; int n,r; double p
,ap
;
while(~scanf("%d%d",&n,&r) && (n||r)){
memset(ap,0,sizeof(ap));
double rp=0;
for(int i=0;i<n;i++) scanf("%lf",&p[i]);
for(int S=0;S<(1<<n);S++){
if(bitcnt(S)==r){
double ans=1;
for(int i=0;i<n;i++){
if(S&(1<<i)) ans*=p[i];
else ans*=(1-p[i]);
}
rp+=ans;
for(int i=0;i<n;i++){
if(S&(1<<i)) ap[i]+=ans;
}
}
}
printf("Case %d:\n",++cas);
for(int i=0;i<n;i++) printf("%.6f\n",ap[i]/rp);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: