![]() |
1
1
您提供的代码效率很低。为了找到63的解,假设它将首先以最小硬币(即1)的步骤递归到目标量。然后,在多次回溯并尝试使用其他硬币后,它最终回溯到最外层,并尝试使用价值为5的硬币。现在递归又开始了,就像以前一样,添加了值为1的硬币。但问题是,这个中间值(63-5)之前已经被访问过(在选择硬币1后深入5层),需要进行大量函数调用才能得到该值的结果58。然而,算法将忽略这一点,并再次执行所有这些工作。 一种常见的解决方案是动态编程,即记忆早期发现的解决方案,以便无需额外工作即可重用。 我将在这里介绍一种自下而上的方法:它首先检查只需一枚硬币即可获得的所有金额。这些金额被放入队列中。如果目标在其中,那么答案是1。如果没有,则通过将所有可能的硬币添加到每个硬币来处理队列中的所有金额。有时会找到以前访问过的值,在这种情况下,它不会被放入下一个队列,但在其他情况下,它会被放入下一个队列。如果现在目标值在该队列中,那么您知道只需2个硬币即可达到目标。 这一过程在循环中继续,实际上这只是树中的广度优先搜索,其中数量是节点,边表示通过向其中添加一枚硬币可以从另一个数量中获得一个数量。搜索从表示数量为0的节点开始。 下面是代码:
|
![]() |
codenovice · 列表的数组实现的重复关系 7 年前 |
![]() |
Ilya · 递归结构的向量存在内存问题 7 年前 |
![]() |
Akash · Python-从字典列表创建动态嵌套字典 7 年前 |
![]() |
Ali · 递归函数未按预期停止 8 年前 |
![]() |
Spurious · php Iterator-如何保存所有倒数第二的元素 12 年前 |
![]() |
Flavius · 绳索数据结构,维基百科上的冗余,还是我遗漏了什么? 12 年前 |