学会从n个数中取x位的各种组合的实现方法
题目:
输入一个正整数T(T<=100),表示有T组数据,对于每组数据首先输入一个 n (7<=n<=13),表示有 n 个题目,接下来输入三行,
第一行输入 n 个数a_i,第二行输入 n 个数b_i,第三行输入 n 个数c_i, 其中 a_i, b_i, c_i 表示abc三个同学做出第i个题的概率,最后输入一个 x 表示教练想要知道你们队伍做出的题目数(x>=0)。
输出一行,表示做出x题的概率,保留四位小数。
ac代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{ int n,t,x,i,j;
double a[20],b[20],c[20],p[20],sum;
scanf("%d",&t);
while(t--)
{ scanf("%d",&n);sum=0;
for(i=0;i<n;i++)
scanf("%lf",&a[i]);
for(i=0;i<n;i++)
scanf("%lf",&b[i]);
for(i=0;i<n;i++)
scanf("%lf",&c[i]);
for(i=0;i<n;i++)
p[i]=(1-a[i])*(1-b[i])*(1-c[i]);//做不出第i题的概率
scanf("%d",&x);
if(x>n) printf("0.0000\n");
else
{ for(i=0;i<(1<<n);i++)
{ double ans1=1.0;
int cnt=0;
for(j=0;j<n;j++)
{ if(i&(1<<j))
{
ans1=ans1*(1-p[j]);cnt++; }
else ans1=ans1*p[j];
}
if(cnt==x) sum=sum+ans1;
}
printf("%.4lf\n",sum);
}
}
return 0;
}
说明:
for(i=0;i<(1<<n);i++)
{ double ans1=1.0;
int cnt=0;
for(j=0;j<n;j++)
{ if(i&(1<<j))
{
ans1=ans1*(1-p[j]);cnt++; }
else ans1=ans1*p[j];
}
if(cnt==x) sum=sum+ans1;
通过这个运算,可以表示取出cnt位的各种组合,,