51nod3144 超级购物

3144 超级购物

n个人去逛商场,第i个人在商场买东西的概率为p_{i}。(1<=n<=20)

他们逛完商场后,已知有r个人买了东西,对每个人求他买了东西的概率。

输入

第一行两个整数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;
}

おすすめ

転載: blog.csdn.net/ZCH1901/article/details/120295467