作为一项家庭作业,我们的教授向我们介绍了硬币兑换问题的简化版本,在该版本中,我们无需最小化使用的硬币数量或跟踪可能的组合数量。取而代之的是,我们只需要确定是否有一定数量的相同或不同面额的硬币完全等于某个M即可。
我的问题递推方程如下:
let k = 0
If ∑ (v1 + v2 + … + vn) = M
return true
If ∑ (v1 + v2 + … + vn) < M
return false
Else
Increment k by 1
make recursive call on coin subset {v1, v2, … v(n-k)}
下一个问题是将其转换为表示该问题的动态编程解决方案的伪代码。
我有点卡住了。如果您要制作一个表,列出所有可能的总和{v1 + v2},{v1 + v2 + v3},{v1 + v2 + v3 + v4}等,您最终可以找到一个解决方案,但那不是一个解决方案效率低得多的暴力方法?
我认为该解决方案将包括一些实现回忆的方法或某种方式来存储和检索已经遇到的总和,但是由于该问题不是优化问题,因此我很难设想一个动态解决方案。
我看到的许多动态编程示例建议一次一次地迭代减去元素,这与我的递归方程的组成相似,但是我看不到任何修改可以使此伪代码本质上是动态的
如果有人能启发我,我将非常感激