组合

来源:互联网 发布:解除用户mac地址绑定 编辑:程序博客网 时间:2024/05/17 03:32

 在n个数中,求其中r个数的所有组合

算法思想

当组合的第一个数字选定后,其后的数字是从余下的n-1个数中取r-1个数的组合。这就将求n个数中取r个数的组合问题转化成求n-1个数求r-1个数的组合问题。引入工作数组a[]存放求出的组合,约定函数将确定的r个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[]中的一个组合输出。第一个数可以是n、n-1、.......r,函数将确定组合的第一个数字放入数组后,有两种可能的选择,因还未确定组合的其余元素,继续递归去确定;或因已确定了组合的全部元素,输出这个组合。

 

 #include<stdio.h>
#define nn 100
int a[nn];
void comb(int m,int k)   //m个数中k个数的所有组合
{
    int i,j;
    for (i=m;i>=k;i--)
    {
        a[k]=i;       // 选择第一个数
        if (k>1)       
            comb(m-1,k-1);
        else
        {
            for (j=a[0];j>0;j--)
                printf("%4d",a[j]);
            printf("/n");
        }
    }
}
void main()
{
    int n,r;
    printf("entry n,r:");
    scanf("%d,%d",&n,&r);
    a[0]=r;   //控制输出(组合中)数字的个数
    comb(n,r);
}

 

 

上面那个算法都是先选择n,在n-1

而下面这个算法则相反,它先选择1,再2

#include<stdio.h>
#define nn 10
int n,r;
int a[nn],k;
void comb(int s,int j){
int i;
for(i=s;i<=n-j+1;i++){
a[r-j]=i;               //选择第r-j(0,1,...)数
if(j>1)
 comb(i+1,j-1);
 else{
 for(k=0;k<r;k++)
 printf("%4d",a[k]);
 printf("/n");
 }
}
}
int main(void){
printf("n,r:");
scanf("%d,%d",&n,&r);
comb(1,r);         

 

个人感觉还是第一个容易懂些(呵呵,本人还是个大菜鸟)

总结:

在刚开始写算法的时候,在考虑选择第一个数的时候想了老半天(没有想到用循环来选择)

 

还有很多要很多学习啊!!!