2016-08-14 13 views
0

私は10のテキストファイルに1、-1,0の1つの列を含んでいます。 各ファイルの要素を合計する組み合わせを設定したいと思います。アルゴリズムのループの組み合わせ

たとえば、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'をいくつかのロジックとともに使用して、1つ(または2つ)のループが必要な組み合わせを生成するような良い方法がありますアイテム数 – 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

関連する問題