【问题标题】:Finding all subsets of an array and sum of the individual subsets to an different array in c language在c语言中查找数组的所有子集并将各个子集的总和到不同的数组
【发布时间】:2016-01-17 04:44:19
【问题描述】:

请指定完整的程序...

例如,

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;
    }
} 

【问题讨论】:

  • 提示:n 元素的数组中有 2**n 不同的子集,一个简单的解决方案设置最多 30 个元素就足够了。
  • 显示你的尝试。

标签: c arrays subset-sum


【解决方案1】:

恐怕您的解决方案不起作用:您只是对连续子集求和。该作业告诉您找到所有子集。

枚举所有子集的一种简单方法是使用从 02**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;
}

【讨论】:

  • 我想找到一个数组的所有子集,并在一个名为“aa”的数组中求和,正如我在示例中所尝试的那样......
  • 上面的代码就是这样做的!如果aa 已经是适当大小的数组,则删除函数定义和数组分配。沿虚线剪切。
猜你喜欢
  • 2013-12-01
  • 2017-08-22
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多