• 使用回溯法求所有从n个元素中取m个元素的组合


    不多说了,直接上代码,代码中有注释,应该不难看懂。

    #include <stdlib.h>
    #include <stdio.h>
    
    typedef char ELE_TYPE;
    #define ELE_FMT "%c"
    
    //元素类型和格式符号使用宏定义,很容易改为其他数据类型,如数组类型改为int,则格式符改为"%d ".
    void printCombo(int idx_arr[], ELE_TYPE eArr[],int m)
    {
        int i;
        for (i=0;i<m;i++)
            printf(ELE_FMT,eArr[idx_arr[i]]);
        printf("
    ");
    }
    
    // combos是一个递归函数,使用回溯法,求从n个元素中取m个元素的组合
    // 取到元素的序号保存在数组idx_arr中,每个序号的范围为从0到n-1
    // level为递归深度,取值范围为0到m-1,当level==m-1时, 所有的m个元素已经取到,打印这m个元素的这个组合
    void combos(int n, int m, int idx_arr[], ELE_TYPE eArr[], int level )
    {
        int i,begin,end;
        if (level==0)
            begin=0;
        else
            begin=idx_arr[level-1]+1;
        
        end=n-m+level;
        for (i=begin;i<=end;i++)
        {
            idx_arr[level]=i;
            if ( level==m-1)
                printCombo(idx_arr,eArr,m); //打印这m个打印生成的这个组合
            else
                combos(n,m,idx_arr,eArr,level+1); //继续去下一个元素
        }
    }
    
    int main(int argc, char* argv[])
    {
        int i;
        ELE_TYPE eArr[6]; //定义6个数组的数组,
        int idx_arr[3];   //取到的3个元素的需要放在数组idx_arr中
    
        for (i=0;i<sizeof(eArr)/sizeof(ELE_TYPE);i++) //数组的元素为'A'到'F'
            eArr[i]='A'+i;
    
        combos(sizeof(eArr)/sizeof(ELE_TYPE),3,idx_arr, eArr, 0); //枚举所有6中取3的组合
        return 0;
    }
    


    本程序为纯正的C语言,可将代码另存为combo.c。在VC2008和GCC中编译通过。

  • 相关阅读:
    正则表达式
    cookie和session的区别(转载)
    Http协议
    10倍工程师
    10倍工程师
    HTML介绍
    HTML介绍
    网络基础之网络协议篇
    网络基础之网络协议篇
    计算机中的进制和编码
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3320124.html
Copyright © 2020-2023  润新知