组合全排列算法

组合全排列算法(无空集)
有时候在某些计算场景可以用到

#include

template<typename _T>
class CombinationCalculation
{
    typedef void (*Proc)(_T set[], int count);
public:
    static void Get(_T set[], int count, Proc proc)
    {
        _T *temp = (_T*)malloc(count);
        //combination(whthout empty set)
        for (int i = 1; i < (1 << count); ++i)
        {
            int k = 0;
            for (int j = 0; j < count; ++j)
                if (i & (1 << j))
                    temp[k++] = set[j];
            //a sub set
            //permutation
            do {
                proc(temp, k);
            } while (next_permutation(temp, temp + k));
            //next sub set
        }
        free(temp);
    }
};

使用时

//定义处理函数
void calc(int a[], int n)
{
    //...
}

//...
int a[5];
//使用
CombinationCalculation::Get(a, 5, calc);

你可能感兴趣的:(c/c++)