算法循环组合

时间:2016-08-14 08:33:08

标签: c++ loops combinations

我有10个文本文件,其中包含一列1,-1,0。 我想设置一个组合,它总结每个文件的元素。

例如,如果我想查看10个文件中的2个文件的所有组合,我将在下面创建2个循环: 双倍数;

for(int i;i=0;i<n;i++){
    for(int j;j=i;j<n;j++){
        sum += x[i]+x[j];
    }
}

另一个例子,如果我想看到10个文件中3个文件的所有组合,我会在下面创建3个循环:

for(int i;i=0;i<n;i++){
    for(int j;j=i;j<n;j++){
        for(int k;k=j;k<n;k++)
           sum += x[i]+x[j]+x[k];
        }
    }
}

依此类推,如果我想在10个文件中看到组合x文件,我会创建x循环。

我的问题是:我正在寻找一种通过选择x来确定循环次数的算法。如果x = 2,那么我创建2个循环,如果x = 3,那么我创建3个循环,如果x = 4,那么我创建4个循环,...或者可能有另一种方式。 非常感谢

2 个答案:

答案 0 :(得分:1)

我不确定您提供的代码是否真的有效for (int i;i=0;i<n;++i),最有可能是for (int i=0;i<n;++i)。虽然如此,你正在寻找某种递归。

我假设您已将此数据存储在std::vector中,而不是我建议您创建2D变体std::vector<std::vector<int>>

递归需要2个元素:停止条件和递归:

void function(int &sum, const std::vector<std::vector<int>> &data, std::size_t outerLevel, std::size_t innerLevel, int intermediate) {
    // Stop condition of recursion,
    // if we don't have any elements any more,
    // the intermediate is our final result.
    if (outerLevel == data.size()) {
        sum += intermediate;
        return;
    }

    // Recursing
    const std::vector<int> &subData = data[outerLevel];
    for (auto i = innerLevel; i < subData.size(); ++i) {
        function(sum,
                 data,
                 outerLevel+1, // Go to the next std::vector<int>
                 i,            // Make sure the next inner loop starts at the right index
                 intermedite+subData[i] // Take the intermidiate sum
                 );
    }
}

// Wrapper to hide itermediate calculation variables
int functionWrapper(const std::vector<std::vector<int>> &data) {
    int sum = 0;
    function(sum, data, 0, 0, 0);
    return sum;
}

答案 1 :(得分:0)

如果您只是想计算总和,那么它就像

一样简单
for (int i = 0; i < n; i++) {
    for (int j = i; j < n; j++) {
        sum += x[i] + x[j];
    }
}

相当于

for (int i = 0; i < n; i++) {
    sum += (n - i) * x[i];
    for (int j = i; j < n; j++) {
        sum += x[j];
    }
}

并付出更多努力

sum += (n + 1) * std::accumulate(std::begin(x), std::end(x), 0);

和3

const int sumx = std::accumulate(std::begin(x), std::end(x), 0);
sum += ((n + 1) * (n + 2) / 2) * sumx;