在任何给定的问题中,是否有任何定义的方法来选择用于记忆的变量?

问题描述

例如,如果我们有以下问题:

给定一组硬币 - [1,2,5] 和数量 - 11。找出制作 11 所需的最少硬币数量

我们可以使用递归来探索状态空间。例如,根为空,我们从硬币数组的索引 0 开始。从根上,我们可以选择取硬币1(硬币数组的索引0)或不取硬币1,继续递归探索状态空间。

但是我们如何选择用于记忆的变量呢?是否有任何定义的通用方式来选择它?

在这个问题中,我直觉地选择了以下变量用于记忆:

元组键:(硬币的总和,我们正在探索的硬币数组的索引) 价值:硬币数量

但它不起作用。

解决方法

困难的部分是找到递归。所以你首先需要使用递归找到一个解决方案,剩下的就很简单了。

通常,我们可以尝试将答案表达为函数。例如,让 f(x) 等于制作 x 所需的最小硬币数量。所以答案是f(11)

接下来,我们尝试找到一些递归和基本情况。在这种情况下,f(x) = min(f(x-1),f(x-2),f(x-5)) + 1f(0) = 0f(x) = inf 如果 x < 0

您可以在记忆之前实现此功能,并使用少量输入进行测试以查看其是否有效。

递归部分完成后,备忘录参数是影响结果的函数参数。在这种情况下,只有一个参数,它是您应该在备忘录中使用的参数。