2016-08-14 80 views
0

我有10個文本文件,其中包含一列1,-1,0。 我想設置一個總和每個文件的元素的組合。例如,如果我想查看10個文件中的2個文件的所有組合,我將在下面創建2個循環: double sum;算法循環組合

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個循環,或者可能有另一種方法。 非常感謝

+3

如果你有50個文件,50個嵌套循環?這太瘋狂了。不用說,有更好的方法,比如使用'std :: next_permutation'和一些邏輯來生成組合(在這裏有許多**例子),你需要一個(或兩個)循環,而不管項目的數量。 – PaulMcKenzie

+0

@PaulMcKenzie'std :: next_permutation'在這裏看起來不是很有用,因爲TS需要組合,而不是排列 – alexeykuzmin0

+0

@ alexeykuzmin0 - 你錯了。你可以使用'std :: next_permutation'來產生組合,如果你[努力一點]。(http://stackoverflow.com/questions/9430568/generating-combinations-in-c)。訣竅是使用由布爾值組成的控制數組。 – PaulMcKenzie

回答

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; 
} 
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; 
+0

我想感謝你們所有對我的問題回答如此迅速的人。我會研究答案,如果我明白,會回來一段代碼。我不得不說,我需要花點時間來確保我理解算法。首先,我將學習PaulMcKenzie – pchiknagi

+0

我也會學習JVApen的答案 – pchiknagi