代码如下:
template<class T>
void combine(T set[], int n, int k, void (*cbk)(T set[]))
{
unsigned char * vec = new unsigned char[n];
T * subset = new T[k];
// build the 0-1 vector.
for(int i = 0; i < n; i++)
{
if (i < k)
vec = 1;
else
vec = 0;
}
// begin scan.
bool has_next = true;
while (has_next)
{
// get choosen.
int j = 0;
for (int i = 0; i < n; i++)
{
if (vec == 1)
{
subset[j++] = set;
}
}
cbk(subset);
has_next = false;
for (int i = 0; i < n - 1; i++)
{
if (vec == 1 && vec[i + 1] == 0)
{
vec = 0;
vec[i + 1] = 1;
// move all 1 to left-most side.
int count = 0;
for (int j = 0; j < i; j++)
{
if (vec[j] == 1)
count ++;
}
if (count < i)
{
for (int j = 0; j < count; j++)
{
vec[j] = 1;
}
for (int j = count; j < i; j++)
{
vec[j] = 0;
}
}