我正在尝试解决最小硬币找零问题。问题是: 给定一个值V,如果我们想以V cents为单位进行找零,并且我们有无限数量的C = {C1,C2,..,Cm}个有价硬币,那么进行更改的最小硬币数是多少?
我建议的算法是:
以数组arr [1..V]开头,其中V为值:
对于所有面额,请初始化arr [d] = 1,因为这是基本情况。如果值==硬币的贬值,则只需要1个硬币,因此它最少。
对于来自i的所有值:1 ... V: 计算更改为“ i”值所需的最小硬币数量。 2.1。这可以通过以下方式完成: 对于所有j:1 ....(i-1) arr [i] = min(arr [i],arr [j] + arr [i-j]);
return arr [V];
此逻辑是否有缺陷或涵盖所有情况? 大多数DP解决方案都使用了二维数组,但我不明白为什么要使用O(n ^ 2)内存空间(如果存在且正确)。 谢谢你。
答案 0 :(得分:0)
如果无法获得某个值V的情况如何?
即我们有硬币{5,6,7,8,9}并且我们不能使值1,2,3,4,您应该将所有值!=虚设单元初始化为无穷大或类似的值。
现在由于大多数人使用O(n ^ 2)内存的原因:
这个问题有多种口味,最常见的一种是您只能使用每个硬币一次,在这种情况下,使用状态dp [i] [j]-考虑第一个i硬币后求和为j的最小硬币了解大多数人的知识,即使这也可以通过O(n)内存来完成(只是向后循环)