把在n个人中m个人买了东西的总概率算出来
用dfs搜索每一种情况就好
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define speed(x) ios::sync_with_stdio(false), cin.tie(x), cout.tie(x)
#define bug(x) cout << #x << " == " << x << '\n';
const ll int MAX_N = 3e2 + 5;
using namespace std;
double p[MAX_N]= { 0 };
double tot=0;
int buy[MAX_N] = {0};///买了代表1
double sum[MAX_N] = {0};
int n,m;
void dfs(int index,int gmrs,double pi)
{
if(index==n+1&&gmrs==m)
{
for(int i=1; i<=n; i++)
{
if(buy[i])
sum[i]+=pi;
}
tot+=pi;
return;
}
if(index>n||index-(gmrs+1)>n-m)
return;
buy[index] = 1;
if(gmrs<m///剪枝
dfs(index+1, gmrs+1, pi*p[index]);
buy[index] = 0;
dfs(index+1, gmrs, pi*(1-p[index]) );
}
int main()
{
int cas=0;
while(scanf("%d %d", &n, &m)!=EOF,n)
{
for(int i=1; i<=n; i++)
{
scanf("%lf", &p[i]);
buy[i] = 0;
sum[i] = 0;
}
tot=0;///n中刚好有m个人买了东西的概率
dfs(1,0,1);///暴力枚举就好
cas++;
printf("Case %d:\n",cas);
for(int i=1; i<=n; i++)
{
printf("%.6lf\n",sum[i]/tot);
}
}
}