奇怪的组合

时间:2016-04-02 17:57:52

标签: c++ algorithm math combinations

我有一个包含3个整数{1,2,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;
}

在上文中,正在跳过1+3

请帮助我。

1 个答案:

答案 0 :(得分:0)

给定集合S power set P(S)是S的所有子集的集合。您要做的是基本上枚举x∈P(S)的所有非空元素。从那里,您可以迭代P(S)中每个非空x的所有元素。

这对你意味着什么?对于包含n个元素的集合S的初学者来说,P(S)的可能元素的数量是2 ^ n,因此幂集的大小与其生成集的大小成指数级地缩放。

但是,如果这对n的小值(特别是n <64)有用,则可以使用unsigned long long变量作为一种索引。特别是,每个位对应一个数组元素。值为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