该算法是否涵盖所有情况,以求总和的最小硬币找零?

时间:2019-06-30 05:19:56

标签: algorithm dynamic-programming

我正在尝试解决最小硬币找零问题。问题是: 给定一个值V,如果我们想以V cents为单位进行找零,并且我们有无限数量的C = {C1,C2,..,Cm}个有价硬币,那么进行更改的最小硬币数是多少?

我建议的算法是:

以数组arr [1..V]开头,其中V为值:

  1. 对于所有面额,请初始化arr [d] = 1,因为这是基本情况。如果值==硬币的贬值,则只需要1个硬币,因此它最少。

  2. 对于来自i的所有值:1 ... V:   计算更改为“ i”值所需的最小硬币数量。 2.1。这可以通过以下方式完成:    对于所有j:1 ....(i-1)          arr [i] = min(arr [i],arr [j] + arr [i-j]);

  3. return arr [V];

此逻辑是否有缺陷或涵盖所有情况? 大多数DP解决方案都使用了二维数组,但我不明白为什么要使用O(n ^ 2)内存空间(如果存在且正确)。 谢谢你。

1 个答案:

答案 0 :(得分:0)

如果无法获得某个值V的情况如何?

即我们有硬币{5,6,7,8,9}并且我们不能使值1,2,3,4,您应该将所有值!=虚设单元初始化为无穷大或类似的值。

现在由于大多数人使用O(n ^ 2)内存的原因:

这个问题有多种口味,最常见的一种是您只能使用每个硬币一次,在这种情况下,使用状态dp [i] [j]-考虑第一个i硬币后求和为j的最小硬币了解大多数人的知识,即使这也可以通过O(n)内存来完成(只是向后循环)