我有一个函数可以生成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,但是,如果有一个适用于没有>,<
个运算符的类型的解决方案,那将会很不错。