创建向量的所有可能组合的总和

时间:2016-01-15 21:40:00

标签: c++ vector

我一直在尝试创建一个程序,该程序应该在向量中找到所有可能的数字组合,并将它们加在一起,然后在最后检查它们是否与给定的数字匹配。我不想找到加起来特定数字的每个数字,而是找到可能组合的总和。这个问题有很多版本,但我已经设法让答案适合我的问题。

我尝试了一个递归版本,这个:

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]等)?

感谢您提供的任何答案!

1 个答案:

答案 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下)并使用它而不需要整个发行版。