算法——使用递归解决组合问题

来源:互联网 发布:电路仿真软件j 编辑:程序博客网 时间:2024/06/04 22:46

从n个数中取m个数,打印所有可能的结果。

思想:把一个大问题分解成很多小问题。先从n个数中取一个,再从取出的这个数序列后面的数中取一个,再从新取出的这个数的序列后面的数中取一个,以此类推,直到只用取一个数,那么只要从剩下的序列中依次取结果就可以了。简单的讲,就是我们高中数学写全组合的次序方法,例如取3个数,就先确定前两个数不变,最后一个依次取序列中的数,取完后再变第2个数,最后都取完后改变第1个数。距离:从6个数中取3个,即为:1 2 31 2 41 2 51 2 61 3 41 3 51 3 61 4 51 4 61 5 62 3 42 3 52 3 62 4 52 4 62 5 63 4 53 4 63 5 64 5 6

C语言代码如下:

#include <stdio.h>#include <malloc.h>#include <stdlib.h>int combine(int n,int m,int *data,int *getComb,int len){    if(m>n||m<1||n<1){        printf("ERROR!\n");        return 1;    }    int i,j;    if(m==1){        for(i=0;i<n;i++){            getComb[len-m]=data[i];            for(j=0;j<len;j++)                printf("%3d",getComb[j]);            printf("\n\n");        }        return 0;    }    for(i=0;i<n-m+1;i++){        getComb[len-m]=data[i];        combine(n-i-1,m-1,data+i+1,getComb,len);    }}//从共有n个元素的数列中取出m个元素 int main(){    int n,m,i;    int *data,*getComb;    printf("从n个数中取m个\n请输入n:");    scanf("%d",&n);    printf("请输入m:");    scanf("%d",&m);    //输入数列    data=(int*)malloc(n*sizeof(int));    getComb=(int*)malloc(m*sizeof(int));    printf("请输入数列:");     for(i=0;i<n;i++){        scanf("%d",&data[i]);    }    //取出数列并打印    printf("则取出m个数共有以下几种组合:");     combine(n,m,data,getComb,m);    return 0;} 
原创粉丝点击