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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值