UVA_11181
设事件B为一共有r个人买了东西,设事件Ai为第i个人买了东西。
那么这个题目实际上就是求P(Ai|B),而P(Ai|B)=P(AiB)/P(B),其中P(AiB)表示事件Ai与事件B同时发生的概率,同时总状态并不多,因此我们可以枚举买东西的状态预处理出P(AiB)和P(B),再代入计算即可。
#include<stdio.h>
#include<string.h>
#define MAXD 25
int N, R;
double ap[MAXD], p[MAXD];
void solve()
{
int i, j, k;
double ans, rp = 0;
for(i = 0; i < N; i ++)
scanf("%lf", &p[i]);
if(R == 0)
{
for(i = 0; i < N; i ++)
printf("0.000000\n");
return ;
}
memset(ap, 0, sizeof(ap));
for(i = 0; i < (1 << N); i ++)
{
k = 0;
for(j = 0; j < N; j ++)
if((1 << j) & i)
k ++;
if(k == R)
{
ans = 1;
for(j = 0; j < N; j ++)
{
if((1 << j) & i)
ans *= p[j];
else
ans *= (1 - p[j]);
}
rp += ans;
for(j = 0; j < N; j ++)
if((1 << j) & i)
ap[j] += ans;
}
}
for(i = 0; i < N; i ++)
printf("%.6lf\n", ap[i] / rp);
}
int main()
{
int t = 0;
for(;;)
{
scanf("%d%d", &N, &R);
if(!N && !R)
break;
printf("Case %d:\n", ++ t);
solve();
}
return 0;
}