我一直在尝试创建一个程序,该程序应该在向量中找到所有可能的数字组合,并将它们加在一起,然后在最后检查它们是否与给定的数字匹配。我不想找到加起来特定数字的每个数字,而是找到可能组合的总和。这个问题有很多版本,但我已经设法让答案适合我的问题。
我尝试了一个递归版本,这个:
vector<int> set = {2,3,4,2};
vector<int> allPossible;
vector<int> onePossible = {};
int sum = 0;
void recursive_comb(int step_val, int array_index)
{
cout << "---" << endl;
for (int i = array_index; i < set.size(); i++){
onePossible.push_back(set[i]);
sum = 0;
for (int j = 0; j < onePossible.size(); j++){
sum += onePossible[j];
if (step_val < 0){
onePossible = {};
}
}
cout << "Adding " << sum << " to allPossible" << endl;
allPossible.push_back(sum);
recursive_comb(step_val - 1, i + 1);
}
}
我的主要功能如下:
int main(){
recursive_comb(set.size() - 1, 0);
for (int i = 0; i < allPossible.size; i++){
for (int j = 0; j < allPossible.size; j++){
if (allPossible[i] == allPossible[j]){
cout << "There is are two possible combinations that are alike << endl;
}
}
}
}
我的问题是,当我的onePossible被清空时,它根本就不会消失。我也尝试在for循环中的每个点清空它,但这也没有真正起作用,数字只是像这样添加到allPossible:
[2], [2], [3], [4] //etc......
我想要的是这个:
[2], [2], [3], [4], [2+2=4], [2+3=5], [2+4=6], [3+4=7] //not including all the repeating ones i might get.
所以我的实际问题是:
如何获得矢量的所有可能总和([1],[2],[1] + [2]等)?
感谢您提供的任何答案!
答案 0 :(得分:1)
从PicklingTools发行版中,有一个类可以计算所有组合。
// Compute all combinations of n choose k. This computes all n choose
// k of combinations of the distinct integers 1..n. Note that the
// permutations are permuted in sorted order. Other data can be
// "combinated" by using the numbers here as indicies into an array.
// // Typical usage
// #include "occombinations.h"
{
Combinations c(n,k);
do {
int* cur = c.currentCombination();
printCurrentCombination(cur, n, k);
} while (c.nextCombination());
}
它返回的是一个可用于置换矢量的索引列表:
Combinations c(n,k);
do {
int *cur = c.currentCombination();
int sum = 0;
for (int ii=0; ii<k; ii++) {
sum += vec[cur[ii]-1]; // Notice the extra indirection
}
if (sum==match_sum) { .. do something .. }
} while (c.nextCombination());
组合类给出一个基础组合,所以注意额外的-1。 所有5种选择它将给出的组合是:
n = 5 k = 2
(1 2)
(1 3)
(1 4)
(1 5)
(2 3)
(2 4)
(2 5)
(3 4)
(3 5)
(4 5)
编辑:组合生成器在C ++ STL的置换生成器之后建模。这些组合的实际代码文件是相当独立的:你可能会拔出&#34; occombinations.h&#34;在PicklingTools发行版中(它在C ++ / opencontainers_1_8_2 / include下)并使用它而不需要整个发行版。