您的位置:首页 > 其它

C - Probability|Given UVA - 11181 (数学概率)

2017-07-27 13:25 288 查看

题目链接:点击打开链接

题意:n 个人去购物,只有 r 个人买东西,而剩下的 n - r 个人不买东西,给出每个人可能买东西的概率,让求每个人在那 r 个人中的概率;

       概率公式:P(A | B)= P(AB)/ P(B) ;P(A | B)指的是在 B 发生的情况下,A 发生的概率; P(AB) 指的是A 和B 同时发生的概率,P(B)指B 发生的概率;

       在本题中,有 t1,t2,t3 三人,两人买东西,以 t1为例, P(A| B)是结果,P(AB)是 3 人中 2 人买东西且 t1 的概率,P(B)指全部两人买东西的概率;

       例如:

                n = 3,r = 2;

                t1 = 0.1 ,t2 = 0.2 , t3 = 0.3

                t1: P(AB)=0.1*0.2*0.7+0.1*0.8*0.3;      P(B) = 0.1*0.2*0.7+0.1*0.8*0.3+0.9*0.2*0.3        所以 P(A | B)=P(AB)/ P(B)=0.413043;

        详情见代码;

#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<iomanip>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
int n,r;
int kase=0;
while(cin>>n>>r){
if(n==0&&r==0) break;
double a[n+10];
for(int i=0;i<n;i++)
scanf("%lf",&a[i]);
string str;
for(int i=0;i<n-r;i++)
str+='0';
for(int i=n-r;i<n;i++)
str+='1';
double num[n+10];
memset(num,0,sizeof(num));
double sum=0.0;
do{
double ans=1.0;
for(int i=0;i<str.length();i++){
if(str[i]=='1') ans=ans*a[i];
else ans=ans*(1-a[i]);
}
for(int i=0;i<n;i++){
if(str[i]=='1')
num[i]+=ans;
}
sum+=ans;
}while(next_permutation(str.begin(),str.end()));

cout<<"Case "<<++kase<<":"<<endl;
for(int i=0;i<n;i++){
cout<<fixed<<setprecision(6)<<num[i]/sum<<endl;
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: