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