由凑零钱问题认识 最优子结构
问题描述:
有k种⾯值的硬币,⾯值分别为 c1, c2...ck,每种硬 币的数量⽆限,再给⼀个总⾦额 amount,问你最少需要⼏枚硬币凑出这个⾦额,如果不可能凑出,算法返回 -1。
如:k = 3,⾯值分别为1,2,5,总⾦额amount = 11 。那么最少需要3枚硬币凑出,即11= 5 + 5 + 1。
1、暴力递归
这是一个动态规划的问题,其子问题必须互相独立,即选择每个金额的硬币都是相互独立的,
⽐如你想求 amount = 11时的最少硬币数(原问题),如果你知道凑出 amount =10的最少硬币数(⼦问题),你只需要把⼦问题的答案加⼀(再选⼀枚⾯值为1的硬币) 就是原问题的答案,因为硬币的数量是没有限制的,⼦问题之间没有相互制约,是互相独⽴的。这个过程即符合最优子结构,每一个子问题都求得最少,最终的原问题就会是最少。
对于一个动态规划问题,就要思考如何列出正确的状态转移⽅程?
先确定状态,也就是原问题和⼦问题中变化的变量。由于硬币数量⽆限,所以唯⼀的状态就是⽬标⾦额amount。
然后确定 dp 函数的定义:当前的⽬标⾦额是 n ,⾄少需要dp(n) 个硬 币凑出该⾦额。
然后确定选择并择优</