、题目网址‘点击打开链接
你会发现这
3 2
0.10
0.20
0.30
5 1
0.10
0.10
0.10
0.10
0.10
0 0
Sample Output
Case 1:
0.413043
0.739130
0.847826
Case 2:
0.200000
0.200000
0.200000
0.200000
0.200000
答案是这样出来的,以第一组为例 第一个人 的ans=(a/b)
a=0.1*0.2*0.7+0.1*0.8*0.3
b=0.1*0.2*0.7+0.1*0.8*0.3+0.9*0.2*0.3; 三个数的b是一样的,a是选择
我当时觉得这是个排列组合一定超时,无法写,,
后来看题解,发现是可以用dfs的,方案思路跟选择一样
#include <iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
int n,r;
const int maxn=200+5;
double s[maxn];
double res;
double ans[maxn];//存储每个人被选择的概率
double dfs(int t,int k,double p )
{
if(t>=n)
{
if(k!=0)//z注意k 此时的r如果没有凑够人,则证明这种选择方案不可行,返回0
return 0;
else
return p;
}
double sum=0;
if(k)
{
sum+=dfs(t+1,k-1,p*s[t]); //选择这个人,
ans[t]+=sum;
}
// cout<<sum<<endl;
sum+=dfs(t+1,k,p*(1-s[t]));//不选这个人
return sum;
}
int main()
{
int k=0;
while(cin>>n>>r&&n)
{
k++;
memset(ans,0,sizeof(ans));
for(int i=0;i<n;i++)
cin>>s[i];
double p=dfs(0,r,1);//总概率
printf("Case %d:\n",k);
for(int i=0;i<n;i++)
printf("%.6f\n",ans[i]/p);
}
return 0;
}
、