生成非连续组合。

时间:2016-02-19 22:52:49

标签: c++ combinations combinatorics

我有一个函数可以生成vector中的元素组合。组合的数量通常低于10000,因此非常小。我必须找到解决某个问题的组合。如果一个组合失败,它可能(虽然不确定)相似也会失败。因此,测试非常不同的组合是有意义的:例如[7 1 3]然后[9 5 2]等。

目前,我使用here中的代码(在此answer中链接)来生成所有组合。然后我将它们洗牌,然后尝试它们,直到我找到一个工作组合。更好的是只创建一个组合,尝试它,如果失败,创建另一个组合(这是非常不同的)......

有解决这个问题的好方法吗?

#include <vector>
#include <algorithm>
#include <iostream>

#include "combinatorics.h"

using namespace std;

int main()
{
    vector<int> v(5);
    iota(begin(v), end(v), 0);

    /* Fill combos with all combinations: choose 3 from v */
    vector<vector<int>> combos;
    auto f = [&] (auto a, auto b)
    {
        combos.emplace_back();
        copy(a, b, back_inserter(combos.back()));
        return false;
    };
    for_each_combination(begin(v), begin(v)+3, end(v), f);

    /* Print all combinations */
    for(auto& combo : combos)
    {
        for(auto i : combo)
            cout<<i<<" ";
        cout<<endl;
    }

    /* Shuffle combos and start trying one combination after the other. */
}

PS。使用此代码的原因是,稍后,我很可能会使用置换函数。作为答案,他们似乎表现得非常好。

在这个示例中,我使用int s,但是,如果有一个适用于没有>,<个运算符的类型的解决方案,那将会很不错。

0 个答案:

没有答案