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;
}