在C编程中,给定一个大小为n的数组,如何找到其数字的所有可能组合的总和?

时间:2017-01-14 21:21:37

标签: c algorithm

假设我有一个数组{1,2,3}

我希望获得其数字的所有可能组合的总和,并将它们存储在另一个数组中,如下所示:

1 + 2 = 3

1 + 2 + 3 = 6

1 + 3 = 4

2 + 3 = 5

1

2

3

新数组将包含{3,6,4,5,1,2}

我应该使用已知的算法吗? 请求

1 个答案:

答案 0 :(得分:1)

你可以非常依赖二进制数字可以代表组合这一事实,如果你只关心那些具有多个值的组合,那么它很容易跳过两个幂,这是一位设置的值。

这并不是你想做的一切,但这是一个开始,你可以从那里适应:

#include <stdlib.h>
#include <stdio.h>

void try_sums(int *args, size_t argc) {
  int top = 1 << (argc - 1);
  int skip = 1;

  for (int i = 1; i < top; ++i) {
    if (i == skip) {
      skip <<= 1;
    }
    else {
      int sum = 0;

      for (int j = 0, k = i; k; k >>= 1, ++j) {
        if (k & 1) {
          if (sum) {
            printf("+");
          }

          printf("%d", args[j]);
          sum += args[j];
        }
      }

      printf("=%d\n", sum);
    }
  }
}

int main(int argc, char **argv) {
  int *terms = malloc(sizeof(int) * argc);

  for (int i = 1; i < argc; ++i) {
    terms[i - 1] = atoi(argv[i]);
  }

  try_sums(terms, argc);

  free(terms);

  return 0;
}