首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个关于组合的有关问题

2012-09-13 
一个关于组合的问题?下面代码在VC6 环境调试通过,运行结果也是正确.我请教的问题,在最后给出.#include io

一个关于组合的问题?
下面代码在VC6 环境调试通过,运行结果也是正确.
我请教的问题,在最后给出.

#include <iostream>
#include <vector>

using namespace std;

template <class T>
inline void PRINT_ELEMENTS (const T& coll, char tokens[], const char* optcstr="")
{
  typename T::const_iterator pos,pos1;  
   
  std::cout << optcstr;
  pos=coll.begin();
pos1=0;
  for (; pos != pos1; ++pos)
{
pos1 = coll.end();
pos1--;
  std::cout << tokens[*pos] << ' ';
  }
  std::cout << std::endl;
}

//计算组合数C(n,m)
int C(int n, int m)
{
  double result = 1;

  for (int i = 0; i < m; i++)
  {
  result *= n - i;
  result /= i + 1;
  }
  return (int)result;
}

//计算第rank个组合,rank表示序号从0到C(n,card)-1
void unrankCombination( int rank, vector<int> &subset, int card)
{
  int p, m;

  m = rank;
  for(int i = card - 1; i >= 0; i--) 
  {
  p = i;
  while( C(p+1, i+1) <= m ) p++;
  m -= C( p, i+1 );
  subset[i] = p;
  }
}

//计算组合的序号,从0开始,subset存放组合,(0 1 2 ... card-1 )的序号
int rankSubset( vector<int> &subset, int card)
{
  int i;
  int rank = 0;

  for(i = 0; i < card; i++)
  {
  rank += C( subset[i], i + 1 );
  }
  return rank;
}

int main(int argc, char* argv[])
{
/*
  int m = 3;
  int n = 10;
*/
  int m = 3;
  int n = 4;
   
  vector<int> combination( m + 1 );
  /*char tokens[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'};*/
  /*char tokens[] = {'A','B','C','D','E','F','G','H','I','J'};*/
  /*char tokens[] = {'A','B','C','D','E','F','G','H','I'};*/
char tokens[] = {'A','B','C','D'};

int count = C( n, m );//组合个数,从n个数据中选择m个
  for( int rank = 0; rank < count; rank++)
  {
  unrankCombination( rank, combination, m );
  cout << rank + 1 << "-" << rankSubset( combination, m ) << ": ";
  PRINT_ELEMENTS( combination, tokens );
  }

  cout << "\n\tpress Enter to exit ..." << endl;
  cin.get();

  return 0;
}

问题如下:
1)计算第rank个组合
combination是个vector ,如何理解unrankCombination( rank, combination, m );

2)计算组合的序号
如何理解 int rankSubset( vector<int> &subset, int card)

3) 如何理解rank

期待朋友的答复


[解决办法]
建议用“[code=C/C++][/code]”先排好版,要不代码稍多久看不清了

热点排行