生成矢量的powesets

时间:2016-03-23 03:50:17

标签: c++ vector powerset

我目前正在尝试编写一个允许我创建向量的powerset的函数。我目前有一个对象向量和一个向量的空向量。我在网上环顾四周,发现a recursive algorithm,但在我的情况下无法让它工作。

算法:

void Game::PowersetRec(vector <Die> & s, int k, int m, int n) {
    // Recursively builds a vector which is the powerset of the input vector
    if (m <= n) {
        s[k+1].pips = m ;
        powerset.push_back(s) ;
        PowersetRec(s, k+1, m+1, n) ; /* with m */
        PowersetRec(s, k, m+1, n) ; /*  without m */
    }
}

PowersetRec(rolledDice, 0, rolledDice[0].pips, rolledDice[rolledDice.size() - 1].pips);

powerset是我的向量向量,rolledDiceDie个对象的向量,它们具有pips属性(这是一个整数)。

当我打印出powerset时,我得到了这个(样本):

1, 1, 4, 6, 4, 6
1, 1, 2, 6, 4, 6
1, 1, 2, 3, 4, 6
1, 1, 2, 3, 4, 5

鉴于算法,这对我有意义,但不是powerset,这意味着我不知道原始算法是如何工作的。

编辑:This answer似乎很有用,但我无法在GCC中编译列出的代码(组合)。

1 个答案:

答案 0 :(得分:0)

我能够通过the different combinations of a vector's values

回答这个问题

我只是将char更改为我的die对象。

编辑:下面的完整代码。

void Game::PowersetGen(vector <Die> & v) {
for (int counter = 1; counter < (1 << v.size()); ++counter) {
        vector <Die> combination;
        for (int i = 0; i < v.size(); ++i)
        {
            if (counter & (1 << i))
                combination.push_back(v[i]);
        }

        powerset.push_back(combination);
    }
}

简单澄清编辑:<Die>只是我的向量中对象的名称,理想情况下,此函数将被模板化以使用任何数据类型。