3144 超级购物
有个人去逛商场,第个人在商场买东西的概率为。(1<=n<=20)
他们逛完商场后,已知有个人买了东西,对每个人求他买了东西的概率。
输入
第一行两个整数n,r
接下来一行n个100以内的整数,第i个整数ti,pi=ti/100为第i个人买东西的概率。
输出
一行n个数,第i个数表示第i个人买了东西的概率。与标准输出的绝对误差不超过1e-3
数据范围
对于30%的数据: n<=5
对于60%的数据: n<=10
对于100%的数据: 1<=n<=20,0<=r<=n,10<ti<100
输入样例
3 2
10 20 30
输出样例
0.413043 0.739130 0.847826
解析:
直接根据条件概率的定义来
P(A|B) = P(AB)/P(B)
在这道题中B就是r个人买了东西
A就是某个人买了东西
然后考虑所有情况的概率,累加起来求的各个事件的概率
放代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
double f[100][100];
int p[100];
int n,r;
double solve(int ban)
{
f[0][0]=1;
for(int i=1;i<=n;i++)
{
if(i==ban){for(int j=0;j<=min(i,r);j++)f[i][j]=f[i-1][j];continue;}
for(int j=0;j<=min(i,r);j++)
{
f[i][j]=(1-p[i])*f[i-1][j];
if(j!=0)f[i][j]+=p[i]*f[i-1][j-1];
}
}
return f[n][r-(ban!=0)];
}
int main()
{
int T=0;
while(scanf("%d%d",&n,&r)==2)
{
if(n==0)return 0;
for(int i=1;i<=n;i++)scanf("%lf",p+i);
double P=solve(0);++T;
for(int i=1;i<=n;i++)printf("%.6lf ",solve(i)*p[i]/P);
}
return 0;
}