【发布时间】:2015-06-18 08:30:55
【问题描述】:
给定一个 N 值,如果我们想找 N 美分,并且我们有无限供应 S = { S1, S2, .. , Sm} 价值的硬币,我们有多少种方法可以找零?硬币的顺序无关紧要。
例如,对于 N = 4 和 S = {1,2,3},有四种解:{1,1,1,1},{1,1,2},{2,2}, {1,3}。所以输出应该是 4。对于 N = 10 和 S = {2, 5, 3, 6},有五种解决方案:{2,2,2,2,2},{2,2,3,3}, {2,2,6}、{2,3,5} 和 {5,5}。所以输出应该是5。
现在,我有一个疑问。为什么我们不能做类似的事情,
arr[i] = arr[i-1] + arr[i-2] + arr[i-3]
这基本上是,arr[i] 存储了求和 i 的方法数。我在这里给出的方法有点类似于n stairs problem,即我可以爬固定数量的楼梯,也就是说,假设一次 1 个楼梯或一次 2 个楼梯,我必须计算总数从底部到达顶部的方法。为什么我们不能在这个问题中使用类似的方法?
【问题讨论】:
-
你为什么不尝试实现这个想法,然后把它放在这里?我认为我们没有任何规则不使用任何类型的方法/想法。
-
我想问的是,这会是解决这个问题的正确方法吗?此外,我并不是要你帮我编写问题或调试一些代码,我只想知道,这是否是解决上述问题的正确方法?
-
这行不通,因为您可能会添加相同的案例(假设顺序被忽略)。
-
动态编程通常被称为递归的替代方案。话虽如此,您能想一想递归解决方案与您的想法有何不同吗?
-
重点是,最好看看你的实现并告诉你哪里出了问题。仅凭您的描述,很难说什么(至少是伪代码)。同意吗?
标签: c++ algorithm dynamic-programming