一种非递归的组合问题的解决方法
默认是从1-n这n个数中取m个,有多少种组合
其他诸如字符、字符串等的组合问题均可建立映射表解决
总体思路是对所有组合进行分类,进位前后分为两类
1234 1235 1236为一类
1245 1246 为一类
1256 为一类
1345 1346为一类
1356为一类
……
每一次大的while循环解决“一类组合的输出”和“下一类的预备”工作
#include <stdio.h>
#include <stdlib.h>
int combine(int n, int m);
int main(void)
{
combine(6, 4);
return 0;
}
int combine(int n, int m) //从n个数中选m个 有多少种组合
{
if(m>n || m<1) return -1;
int i, j, t;
int* a = (int*)malloc(sizeof(int)*m);
for(i=0; i<m; i++) a[i] = i+1; //第一组合
while(a[0]<=n-m+1) {
for( ; a[m-1]<=n; a[m-1]++){//末位递增产生组合 输出 直至进位
for(t=0; t<m; t++){
printf("%d ", a[t]);
}
printf("\n");
}
for(j=m-2; j>=0; j--){ //m-2这一位必进位 往左可能继续进位
a[j]++; //一位进位
if(a[j]<=j+n-m+1) break;//不继续进位
}
for(j++; j<m; j++){ //进位位之后应依次递增
a[j] = a[j-1]+1;
}
}
return 0;
}