我有一个包含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
。
请帮助我。
答案 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