作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我有一组面额为 a1、a2、... ak 的硬币。
已知其中一个等于 1。
我想用最少的硬币数对 1 到 n 的所有整数进行找零。
算法的任何想法。
eg. 1, 3, 4 coin denominations
n = 11
optimal selection is 3, 0, 2 in the order of coin denominations.
n = 12
optimal selection is 2, 2, 1.
注意:不是作业只是对this的修改问题
最佳答案
这是一个经典的动态规划问题(首先请注意,贪心算法在这里并不总是有效!)。
假设硬币的顺序是 a_1 > a_2 > ... > a_k = 1
.我们定义一个新问题。我们说 (i, j)
问题是找到最小数量的零钱 j
使用硬币 a_i > a_(i + 1) > ... > a_k
.我们希望解决的问题是(1, j)
对于任何 j
与 1 <= j <= n
.说C(i, j)
是 (i, j)
的答案问题。
现在,考虑一个实例 (i, j)
.我们必须决定是否使用 a_i
之一硬币。如果不是,我们只是在解决 (i + 1, j)
问题,答案是C(i + 1, j)
.如果是,我们通过对 j - a_i
进行更改来完成解决方案。 .为了使用尽可能少的硬币来做到这一点,我们想解决 (i, j - a_i)
问题。我们安排事情以便为我们解决这两个问题,然后:
C(i, j) = C(i + 1, j) if a_i > j
= min(C(i + 1, j), 1 + C(i, j - a_i)) if a_i <= j
现在弄清楚初始情况是什么以及如何将其翻译成您选择的语言,您应该可以开始了。
如果您想尝试解决另一个需要动态规划的有趣问题,请查看 Project Euler Problem 67 .
关于algorithm - 换币算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1986828/
我是一名优秀的程序员,十分优秀!