我尝试在C++中翻译一个生成n中k的所有排列的算法:
public void calculerEquipeTOT(ArrayList<Nageur> L, ArrayList<Nageur> F, int k) {
if (k == 0) {
if (calculerPointsTOT(L) > this.pointsMeilleureEquipe){
this.meilleureEquipe = L;
this.pointsMeilleureEquipe = calculerPointsTOT(meilleureEquipe);
}
} else {
for (Nageur x : F) {
ArrayList<Nageur> G = new ArrayList<Nageur>(F);
G.remove(G.indexOf(x));
ArrayList<Nageur> L2 = new ArrayList<Nageur>(L);
L2.add(x);
calculerEquipeTOT(L2, G, k - 1);
}
}
}
我的问题是列表可能是对象列表,我不知道如何删除L2列表的x ...我不是CMaven,我用Java管理它,但我必须用C做它。
3条答案
按热度按时间ryevplcw1#
我把你的函数音译了一下,得到了以下结果
程序输出为
我不知道这是否是你想得到的。
如果调用k等于3的函数,则程序输出将为
v1l68za42#
我找到了一种方法,可以使用标准库中的next_permutation()和本文中的另一个next_combination()来完成我想做的事情:http://www.codeguru.com/cpp/cpp/algorithms/combinations/article.php/c5117/Combinations-in-C.htm
我的解决方案:
显示:
在我的计算机上,用不到1秒的时间就能找到12个排列中的10个排列......我不知道这是不是一个好算法,但它比我以前在Java中的算法要快。
如果有人看到如何改进和优化它,我很感兴趣!:)
8ulbf1ek3#
调用permute(nums),并将nums作为一个向量传递,该向量将返回另一个包含所有已排列数字的向量。