m个数中取n个数的所有组合问题
从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端
代码如下:
#include <iostream> using namespace std; #define SIZE 100 struct data{ int elem; int b; }; inline void move(data tmp[], int num, int r){ for(int i = 0; i < num; i++){ tmp[i].b = 1; } for(int j = num; j < r; j++){ tmp[j].b = 0; } } inline void println(data tmp[], int len){ for(int i = 0; i < len; i++){ if(tmp[i].b == 1) cout << tmp[i].elem << " "; } cout << endl; } void comb(int arr[], int len, int count){ data tmp[SIZE]; for(int i = 0; i < len; i++){ tmp[i].elem = arr[i]; if(i < count){ tmp[i].b = 1; } else{ tmp[i].b = 0; } } println(tmp, len); while(true){ int j = 0; int num = 0; while(j+1 < len){ if(tmp[j].b == 1){ num++; if(tmp[j+1].b == 0){ tmp[j].b = 0; tmp[j+1].b = 1; move(tmp, num-1, j); break; } } ++j; } if(j+1 < len) println(tmp, len); else break; } } int main(int argc, char* argv[]) { int testArr[] = {2, 5, 1, 7, 4}; int len = sizeof(testArr)/sizeof(int); comb(testArr, len, 3); return 0; }