uva 11181

时间:2021-10-08 05:35:40

直接枚举计算就行;

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 22
using namespace std; double ans[maxn],p[maxn];
bool vis[maxn];
int n,r;
void dfs(int cur,int cot)
{
if(cur>n)
{
if(cot==r)
{
double tmp=;
for(int i=; i<=n; i++)
{
if(vis[i])
tmp*=p[i];
else tmp*=(-p[i]);
}
ans[]+=tmp;
for(int i=; i<=n; i++)
if(vis[i])
ans[i]+=tmp;
}
return;
}
vis[cur]=;
dfs(cur+,cot);
vis[cur]=;
dfs(cur+,cot+);
vis[cur]=;
} int main()
{
int ca=;
while(scanf("%d%d",&n,&r)&&(n+r))
{
for(int i=; i<=n; i++)
{
ans[i]=;
vis[i]=;
}
for(int i=; i<=n; i++)
scanf("%lf",&p[i]);
dfs(,);
printf("Case %d:\n",ca++);
for(int i=;i<=n;i++)
printf("%lf\n",ans[i]/ans[]);
}
return ;
}