#include stdio.h
创新互联专业为企业提供永春网站建设、永春做网站、永春网站设计、永春网站制作等企业网站建设、网页设计与制作、永春企业网站模板建站服务,十余年永春做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
int comb(int n, int m)
{
if (m==1)return n;
if (n==m||m==0)return 1;
return comb(n-1, m-1)+comb(n-1, m);
}
int main()
{
printf ("%d\n", comb(2, 1));
return 0;
}
#includestdio.h
int n,k,a[20],b[20]={0};
void work(int k1)
{int i,j,t;
t=k1==0?0:a[k1-1]+1;
for(i=t;in;i++)
{
if(!b[i])
{
a[k1]=i;
b[i]=1;
if(k1==k-1)
{
for(j=0;jk;j++)
printf("%d ",a[j]+1);
printf("\n");
}
else
work(k1+1);
b[i]=0;
}
}
}
main()
{
int i;
scanf("%d %d",n,k);
for(i=0;in;i++)a[i]=i;
work(0);
getch();
return 0;
}
举个例子 不太明白是什么组合数
补充======
说白了就是求阶乘
fun是阶乘函数
直接调用即可
#include stdio.h
long sum=0;//组合数结果
long fun(int i) //阶乘
{
If(n==1)
return 1 ; /*递归出口*/
else
return i*fun(i-1); /*递归体*/
}
long com(int n, int m)
{
sum=fun(m)/fun(n)*fun(m-n);
return sum;
}
int main(void)
{
int m=9,n=4;
printf("%l" , com(4,9));
return 0;
}
for (i=m;i=k;i--)
{ a[k]=i;
if (k1)
comb(i-1,k-1);
else
{
counts++;
for (j=a[0];j0;j--)
printf("%4d",a[j]);
printf("\n");
}
}
}
这是一个递归求组合的算法,递归会把所有条件的"遍历"一次,根据要求处理。
else 是最终k=1时输出,不用解释。关键看if 里面 comb(int m,int k) 有个for 使得a[k]=i; i的取值可以为 m-k,
所以对于输入5 3
对应的是a[0]取为5 -3
a[1] 4-2,
a[2] 3-1,通过递归输出了所有组合。
进一步学习,下面这篇文章不错
#include stdio.h
#include stdlib.h
int Comb(int n, int k)
{
if (n==k || k==0)
return 1; //边界值
else
return Comb(n-1, k)+Comb(n-1, k-1);
}
void main()
{
int n, k;
printf("请输入总人数 n: ");
scanf("%d", n);
printf("请输入委员会人数 k: ");
scanf("%d", k);
if (k0 || n0 || kn) //输入数据的合法性判断
printf("输入不合法!");
else
printf("组合数有 %d 个!",Comb(n, k));
system("pause");
}