1
226
这个问题可以通过所有可能的和的递归组合来解决,过滤掉那些达到目标的和。以下是Python中的算法:
Standford's Abstract Programming lecture -这段视频非常有助于理解递归如何产生解的排列。 编辑
以上作为一个生成器函数,使其更有用一些。需要Python3.3+,因为
下面是相同算法的Java版本:
这完全是同样的启发。我的Java有点生疏,但我认为很容易理解。 (作者@JeremyThompson)
(作者@emaillenin)
编辑:复杂性讨论 NP-hard problem . 它可以在指数时间O(2^n)内求解,例如n=10,将有1024个可能的解。如果你试图达到的目标是在一个较低的范围内,那么这个算法是可行的。例如:
另一方面
如果
|
2
32
这个问题的解决方案已经在互联网上被给出了无数次。这个问题叫做 . 你可以在 http://rosettacode.org/wiki/Count_the_coins http://jaqm.ro/issues/volume-5,issue-2/pdfs/patterson_harmel.pdf (或谷歌 硬币兑换问题 ).
为了尽可能有用,代码应该返回
运行时,显示:
这个
请注意,即使这样,需求也可能无法完全满足。解决方案中每个列表的顺序可能很重要。在这种情况下,每个列表的重复次数必须与其元素的组合次数相同。或者我们可能只对不同的组合感兴趣。
例如,我们可以考虑
要求中也没有说明每个数字(或硬币)是否只能使用一次或多次的问题。我们可以(也应该!)将问题归纳为每个数字出现的列表。这在现实生活中转化为“用一组硬币(而不是一组硬币的价值)来赚一定数量的钱的可能方法是什么”。最初的问题只是这个问题的一个特例,在这里,我们有尽可能多的每一枚硬币的出现,以使总金额与每一枚硬币的价值。 |
3
31
|
4
28
|
5
11
C版@msalvadores代码应答
|
6
11
C++版本的同一算法
|
7
4
我想我会用这个问题的答案,但我不能,所以这是我的答案。它使用的是 Structure and Interpretation of Computer Programs . 我认为这是一个更好的递归解决方案,应该让纯粹主义者更高兴。 搜索结果组合 疯狂是对递归的原始列表进行排序和唯一化,以防止重复。
|
8
4
我已经把上面的逻辑从python转换成php。。
|
9
4
另一个python解决方案是使用
|
10
3
这里是一个Java版本,非常适合小N和非常大的目标和,当复杂性
如果要对32到64个元素之间的集使用此选项,则应更改
|
11
3
这类似于硬币兑换问题
|
12
3
这是R中的一个解决方案
|
13
2
如果设置PRINT 1,它将打印所有组合(但不会使用有效的方法)。
|
14
2
这里有一个更好的版本,具有更好的输出格式和C++ 11个特性:
|
15
2
爪哇
非递归版本,只需不断添加元素并在可能的值之间重新分配它们。
样本输入:
样本输出:
|
16
1
|
17
1
用法:
|
18
1
这个也可以用来打印所有的答案
时间复杂度是指数的。2^n阶 |
19
1
我在为scala任务做类似的事情。想在这里发布我的解决方案:
|
20
1
输出(写入即时窗口)应为:
|
21
1
PHP版本 ,灵感来自Keith Beller的C#版本。
|
22
1
建议回答:
|
23
1
首先推导出0。零是加法的恒等式,因此在这种特殊情况下,它不适用于幺半群定律。如果你想爬到正数,也可以推导出负数。否则你还需要做减法运算。 所以。。。在这个特定的作业中,最快的算法如下JS所示。
这是一个非常快速的算法,但是如果你对
|
24
0
我把C样本移植到了客观C,但在回答中没有看到:
|
25
0
@KeithBeller的回答稍微改变了变量名和一些注释。
|
26
0
|
Toniq · javascript为php保存多维数组 1 年前 |
Jannis · Java中数组的怪异行为 1 年前 |
callum · 如何识别数组中与给定序列不匹配的元素? 1 年前 |
tenfour · 如何使用数组元素的索引初始化数组元素 2 年前 |
Guillaume · 使用操作从Python列表创建numpy数组 2 年前 |
maxMas · Swift 5:为什么会出现索引超出范围错误? 2 年前 |