は、本質的の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
あなたは今まで何をしたのですか? –