组合之01转换法

2014-02-08 13:36:11 · 作者: · 浏览: 98

  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;

  }