请指定完整的程序......
例如,
a[2] = {3,1};
子集将是
{}
{3}
{1}
{3,1}
各个子集的总和将是
{} -> 0
{3} -> 3
{1} -> 1
{3,1} -> 4
数组中各个子集的总和,如
aa[] = {0,3,1,4};
编辑:我试过这个:
n
是数组的大小a
是输入数组aa
是输出数组,包含各个子集的总和。以下是代码:
aa[0] = 0;
z = 1;
for (c = 1; c <= n; c++) {
for (d = 0; d <= n - c; d++) {
if (c == 1) {
sum1 += a[d];
} else {
k = d + c - 1;
for (j = k; j < n; j++) {
for (i = d; i < k; i++)
sum1 += a[i];
sum1 += a[j];
}
}
aa[z] = sum1;
z++;
sum1 = 0;
}
}
答案 0 :(得分:1)
我担心你的解决方案不起作用:你只是在总结连续的子集。该作业会告诉您找到所有子集。
枚举所有子集的一种简单方法是使用从0
到2**n - 1
的循环索引进行迭代,并将索引中的每个低位n位视为包含在当前子集。使用32位整数,如果可以分配输出数组(4GB),则可以使用unsigned int
作为最多30个元素集的索引。较大的集合需要64位索引并生成真正巨大的输出数组。
以下是代码:
#include <stdlib.h>
int *compute_subset_sums(int *a, int n) {
int *aa = calloc(1ULL << n, sizeof(int));
if (aa != NULL) {
/*---------------------cut here--------------------*/
for (size_t i = 0; (i >> n) == 0; i++) {
int sum = 0;
for (int j = 0; j < n; j++) {
if ((i >> j) & 1)
sum += a[j];
}
aa[i] = sum;
}
/*---------------------cut here--------------------*/
}
return aa;
}