Wierd combination

Wierd combination

本文关键字:combination Wierd      更新时间:2023-10-16

我有一个由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被跳过。

请帮我一下。

给定一个集合S,幂集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