使用回顾法求所有从n个元素中取m个元素的组合
使用回溯法求所有从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("\n"); } // 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; }
- 1楼tianxia_taiping9分钟前
- LZ,可以看下这篇文章,一起探讨啊。http://blog.****.net/tianxia_taiping/article/details/11533569