描述:给你n个人,给出每个人会购物的概率,然后给你r,即r个人会购物其余人都不购物。然后需要你输出n行,第i行就是这个r个人中有一个是第i个的概率是多少 其原型就是,有5个人,选3个人出来,甲在其中的概率。不过5变成了n,3变成了r。这个样子的话就是一个条件概率 即p为从n个人中选r个的概率。t就是甲在其中的概率 t/p就是答案 这个样的话,只能暴力了,即在n个人中找出r个人(就是一个组合,不是排列),把这r个人的概率相乘其余人的反面概率相乘。然后所有的这些我概率相加就是p。然后同样的,选定甲,再选r-1个人(组合),甲和这r-1个人的概率相乘,其余人的反概率相乘,然后相加就是t
#include <cstdio>
#include <cmath>
int n,m;
int v[25];
double p;
double arr[25],num[25];
void solve()
{
bool cal[25];
for(int i=0;i<n;++i) cal[i]=0;
double t=1;
for(int i=0; i<m; ++i)
{
t=t*arr[v[i]];
cal[v[i]]=1;
}
for(int i=0; i<n; ++i)
if(!cal[i]) t=t*(1-arr[i]);
for(int i=0; i<m; ++i)
num[v[i]]+=t;
p+=t;
}
void dfs(int cur,int pos)
{
if(cur>=m)
{
solve();
return;
}
for(int i=pos; i<n-(m-cur-1); ++i)
{
v[cur]=i;
dfs(cur+1,i+1);
}
}
int main()
{
// freopen("in.txt","r",stdin);
int t=1;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(!n&&!m) break;
p=0;
for(int i=0; i<n; ++i) scanf("%lf",&arr[i]),num[i]=0;
printf("Case %d:\n",t++);
dfs(0,0);
for(int i=0; i<n; ++i) printf("%.6lf\n",num[i]/p);
}
return 0;
}