多组数据伤不起啊…初始化很重要!
设恰有m个人买东西为E,第i个人买了东西为Ei。
题目所求P(Ei|E)=P(EiE)/P(E)。
P(E)可以通过一遍dfs枚举求得,还可以顺便在dfs中记录每个人选了商品没有,累加进P(EiE)。


【代码】

//UVa 11181 Probability|Given 
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=1e6;
int n,m,T;
double sum[25],p[25],tot;
bool vis[25];
inline void dfs(int num,int buy,double lv)
{
if(num==n+1)
{
if(buy==m)
{
int i;
fo(i,1,num)
if(vis[i])
sum[i]+=lv;
tot+=lv;
}
return;
}
dfs(num+1,buy,lv*(1-p[num])); //不买
if(buy<m)
{
vis[num]=1;
dfs(num+1,buy+1,lv*p[num]); //买
vis[num]=0;
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m) && n)
{
tot=0;M(sum);
fo(i,1,n) scanf("%lf",&p[i]);
dfs(1,0,1);
printf("Case %d:\n",++T);
fo(i,1,n)
printf("%f\n",sum[i]/tot);
}
return 0;
}