给出球的种类和其个数,求出所取出每种颜色球个数组合的概率是多大
组合问题,每取出一个球就可以计算出取出它的概率然后相乘就是所有取出要求所给求的种类和,然后除以总总和球里取出要求各种颜色球的和即可
1 #include <stdio.h>//考虑多种不可能出现情况,概率为1的
2 int color[100];
3 int take[100];
4 /*int fun(int n,int r)
5 {
6
7 if(r>n)//数学定义
8 return 0;
9 if(r==1||r==n-1)//根据组合定义,我们有C(n,1)=C(n,n-1)=n
10 return n;
11 if(r==0||r==n)//根据组合定义,我们有C(n,0)=C(n,n)=1
12 return 1;
13 return fun(n-1,r)+fun(n-1,r-1);//帕斯卡组合公式
14 }*/
15 long long fun(int n,int m)
16 {
17 /*if(m>n-m)m=n-m;
18 for(int i=0;i<m;i++)
19 c=c*(n-i)/(i+1)*/
20
21
22 long long i,c=1;
23 i=m;
24 while(i!=0)
25 {c*=n;n--;i--;}
26 while(m!=0)
27 {c/=m;m--;}
28 return c;
29 }
30
31
32 int main()
33 {
34 int n,k,sum1,sum2;
35 bool flag;
36 while(scanf("%d%d",&n,&k)!=-1)
37 {
38 sum1=0;sum2=1;flag=false;
39 if(n==-1&&k==-1)break;
40 for(int i=0;i<n;i++)
41 {scanf("%d",&color[i]);sum1+=color[i];}
42 for(int i=0;i<n;i++)
43 {scanf("%d",&take[i]);
44 if(take[i]>color[i]){flag=true;break;}
45 sum2*=fun(color[i],take[i]);}
46 if(n==0)
47 {
48 if(k==0)printf("1.00000\n");
49 else printf("0.00000\n");
50 continue;
51 }
52 double cm=(double)1.0/fun(sum1,k);
53 if(!flag)printf("%.5f\n",sum2*cm);
54 else printf("0.00000\n");
55 }
56 return 0;
57 }