C++ standard library提供了两个生成排列的algorithms:next_permutation()与prev_permutation(),却没有提供生成组合数的标准函数。
由于排列与组合之间有着密切的联系,我们很容易就可以从“排列”获得“组合”。从n个元素中任取r个元素的组合,有n! / (r! * (n-r)!)个。这些组合可用多重集{r·1, (n-r)·0}的全排列来生成,请看示例程序:
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
// 从n个元素中,任取r个元素的所有组合:
// G++[o] BCC5[o] VC7[x]
const int n = 7;
const int r = 4; // 0 <= r <= n
vector<int> p, set;
p.insert(p.end(), r, 1);
p.insert(p.end(), n - r, 0);
for ( int i = 0; i != p.size(); ++i )
set.push_back(i+1);
int count = 0;
d