#include<iostream>
#include<cmath>
using namespace std;
const int N = 25;
int c[N][N], n, r;
double p[N], ans[N], tot,vis[N];
void dfs(int i,int sum)
{
if (sum > r) return;
if (n - i + sum < r) return;
if (i == n && sum == r)
{
double res = 1;
for (int i = 0; i < n; i++)
{
if (vis[i] == 0) res *= 1 - p[i + 1];
else res *= p[i + 1];
}
for (int i = 0; i < n; i++)
{
if (vis[i] == 1) ans[i + 1] += res;
}
tot += res;
return;
}
vis[i] = 0;
dfs(i + 1,sum);
vis[i] = 1;
dfs(i + 1,sum + 1);
}
int main()
{
int cnt = 1;
while (true)
{
cin >> n >> r;
if (n == 0 && r == 0) break;
for (int i = 1; i <= n; i++)
{
cin >> p[i];
ans[i] = 0; vis[i] = 0;
}
tot = 0;
dfs(0, 0);
cout << "Case " << cnt << ":" << endl;
for (int i = 1; i <= n; i++)
{
double l = ans[i] / tot;
printf("%.6lf\n", l);
}
cnt++;
}
return 0;
}
一开始考虑的也是状态压缩,但是50组数据,每次遍历20位,再乘个2的20次方,都1e9了,时间都超了