加起来为X的给定数字的组合

时间:2012-12-02 11:19:00

标签: c combinations

虽然它不应该真的很难,但我一直坚持这一点。我需要在C中创建一个函数,它计算并显示给定数字的所有可能组合(不重复),其中每个组合的数字(范围从1到9)在添加时给出指定的总和。

我想这不是最清楚的解释,所以这里有一个例子:计算所有5个数字(从1到9)的组合,最多可以加起来28个。

如果有人能够解释这一点,我将非常感激。

1 个答案:

答案 0 :(得分:1)

由于只有512种不同的选择,您可以轻松预先计算结果。

预先计算:

  • 准备一张名为lookup的空地图(sum => set(set(digit)))。
  • subset个(1..9)
    • 计算其sum
    • 如果lookup没有密钥sum,请创建一个新条目,一个空集。
    • subset添加到lookup[sum]

要查找sum

  • 如果lookup有密钥sum,则返回(副本)条目。否则返回空集。

解决C的一些低级别问题:

map int => x只是一个数组。一组x也只是一个数组+长度。

可以将地图数组分配为静态,因为您已经知道最大的键45。

您也可以预先估计最大的集合集,或使用动态分配(更高效)。如果您不关心空间,您可以轻松地进行过度分配(最多512个条目)。我认为你不想过度分配这么多,所以你也可以学习如何动态分配。

一组数字可以表示为9位位掩码(存储器中为16位)。然后他们很容易列举。

lookup的实际类型草图:

typedef setOfDigits int16;

struct setOfSets{
  setOfDigits* data;
  int16 count; //the actual amount of sets in the set
  int16 space; //the size of the allocated array
}

setOfSets lookup[46];

lookup的实际类型草图,没有动态分配或struct s:

int16 lookup[46][512];
int16 lookupLength[46];

请注意,如果你等同space:=count,那么你永远不会过度分配,但你经常重新分配,这更容易实现,但可能效率低下(但代码运行一次,所以嘿)

当然,高级语言(甚至C ++)本身(javascript)或通过标准库(C ++,Java)具有动态数组。在C中,您必须依赖realloc