2016-04-02 14 views
-7

私は3つの整数の配列を持っています{1,2,3}。私は、1+3がスキップされて、上記でワイアードの組み合わせ

1 1+2 1+3 1+2+3 

2 2+3 

3 


for(int i = 0; i < array.size(); ++i) 
{ 
    for(int j = 0; (i + j) < array.size(); ++j) 
    { 
     sum += my[i + j]; 
     cout << sum << " "; 
     c++;        
    } 
    cout << endl; 
} 

オブ形態の組合せを印刷する必要があります。

私にそれを手伝ってください。集合Sがpower set P(S)は何をしようとするS.のすべての部分集合の集合であり、与えられた

+0

あなたは今まで何をしたのですか? –

答えて

0

は、本質的のx∈P(S)の非空要素の全てを列挙しています。そこから、P(S)の各空でないxのすべての要素を繰り返し処理できます。

これはどういう意味ですか?まあ、n個の要素を含む集合Sの初めは、P(S)の可能な要素の数は2^nなので、出力集合のサイズは、その生成集合のサイズと指数関数的に比例します。

しかし、これはnの小さな値(特にn < 64)に役立つ場合は、unsigned long long変数を使用して一種のインデックスとして機能させることができます。特に、各ビットは配列要素の1つに対応します。値が0のビットは、関連する要素を合計で除外し、1のビットは要素を含みます。このような何かを行うには、次の方法を試してください。

#include <vector> 
#include <iostream> 

void print_sum(const std::vector<int>& array, unsigned long long i) { 
    int sum = 0; 

    for (int index=0; i > 0; i=i>>1, ++index) { 
     if (i % 2 == 1) { 
      std::cout << array[index] << (i>1 ? "+" : "="); 
      sum += array[index]; 
     } 
    } 
    std::cout << sum << std::endl; 
} 

void printer(const std::vector<int>& array) { 
    if (array.size() < sizeof(unsigned long long) * 8) { 
     unsigned long long n = 1 << array.size(); 
     for (unsigned long long i = 1; i < n; ++i) { 
      print_sum(array, i); 
     } 
    } 
} 

int main(int argc, char** argv) { 
    std::vector<int> sample {1, 2, 3, 4}; 

    printer(sample); 

    return 0; 
} 

このプログラムを出力しています

1=1 
2=2 
1+2=3 
3=3 
1+3=4 
2+3=5 
1+2+3=6 
4=4 
1+4=5 
2+4=6 
1+2+4=7 
3+4=7 
1+3+4=8 
2+3+4=9 
1+2+3+4=10