硬币变化 - DP

时间:2015-01-01 13:58:52

标签: dynamic-programming coin-change

我在理解动态编程中的硬币更改问题时遇到了一个小问题。 简而言之,我必须使用最少数量的硬币来改变金额。

我有n个硬币的面额值1 = v1< v2< ......< vn,我们注意到M(j)为金额j做出改变所需的最小硬币数量。

enter image description here 在上面的公式中,我不明白M(j-vi)的含义。 vi必须是j-1中使用的硬币的最大值?

2 个答案:

答案 0 :(得分:1)

你为不同的值j制作成堆的硬币,名为M(j)。 M(j - v i )的要点是考虑一个有价值的硬币v i ,然后你将它添加到哪个堆中以达到值j?当然,具有值j - v i 的桩,因为加上您正在考虑的硬币现在加起来为值j。

当然,目标是尽可能少地使用硬币,因此您可以通过添加v i 的硬币来获取可以延伸的最小桩以达到值j它。这就是min的作用。 +1因为您将硬币v i 添加到桩中以形成新桩M(j)。

答案 1 :(得分:0)

另外一个意味着您再消耗一枚硬币,因此您所做的总更改会减少所添加硬币的数量,这就是原始j值减少的原因。