Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 给定数字加起来等于X的组合_C_Combinations - Fatal编程技术网

C 给定数字加起来等于X的组合

C 给定数字加起来等于X的组合,c,combinations,C,Combinations,虽然这应该不是很难,但我一直被这件事困扰着。我需要用C语言编写一个函数,它计算并显示给定数字的所有可能组合(不重复),其中每个组合的数字(仅在1到9之间)在相加时给出一个指定的和 我想这不是最清楚的解释,所以这里有一个例子:计算所有5个数字的集合(从1到9),加起来是28 如果有人能解释这一点,我将不胜感激。因为只有512种不同的选择,您可以轻松地预先计算结果 要预计算: 准备一个名为lookup的空映射(sum=>set(set(digital)) 对于(1..9)的每个子集 计算其和 如

虽然这应该不是很难,但我一直被这件事困扰着。我需要用C语言编写一个函数,它计算并显示给定数字的所有可能组合(不重复),其中每个组合的数字(仅在1到9之间)在相加时给出一个指定的和

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


如果有人能解释这一点,我将不胜感激。

因为只有512种不同的选择,您可以轻松地预先计算结果

要预计算:

  • 准备一个名为
    lookup
    的空映射(sum=>set(set(digital))
  • 对于(1..9)的每个
    子集
    
    • 计算其
    • 如果
      lookup
      没有键
      sum
      ,则创建一个新条目,即一个空集
    • 子集添加到
      查找[sum]
要查找
总和

  • 如果
    lookup
    具有键
    sum
    ,则返回条目(副本)。否则返回一个空集合

要解决C的一些低级别问题,请执行以下操作:

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

映射的数组可以被分配为静态的,因为您已经知道最大的键45

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

一组数字可以表示为9位掩码(内存中的16位)。那么它们很容易列举

查找的实际类型的草图

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];
查找
的实际类型草图,无动态分配或
结构
s:

int16 lookup[46][512];
int16 lookupLength[46];
请注意,如果您将
空间:=count
,那么您永远不会过度分配,但经常会重新分配,这更容易实现,但可能效率低下(但是代码只运行一次,所以嘿)


当然,高级语言(甚至是C++)都有动态数组,可以是本机的(javascript),也可以是通过标准库的(C++,Java)。在C语言中,你必须依赖于
realloc

,因为只有
512
种不同的选择,你可以很容易地预先计算结果。-@giorashc我在考虑计算所有的可能性,然后丢弃那些不等于给定总和的可能性,但我想这不是很有效。无论如何,我还没有想到一种计算这些的方法,组合数学并不是我的专长forte@Jan德沃夏克,你能说得更具体一点吗?你是在一次问所有的问题,而不是一个具体的问题。你能把问题非常具体地集中在你陷入困境的地方吗?否则,如果我们告诉你一种做这件事的方法,因为它不是对你最有意义的方法,你会很难理解它。用户是否输入数字的数量?2.你说你不能重复组合(我想是{1,3}和{3,1}),但是数字呢?你能重复它们吗{3,3}?3.组合是否有最大数量的数字?4.到目前为止你都试过什么?对他来说太复杂了,我打赌他不知道什么是结构或指针。但是+1作为解释。@AlbertoBonsanto太糟糕了,如果您进行动态分配,您需要知道指针(在这里,结构非常有用)。