动态规划问题(2) 之 由凑零钱认识最优子结构

由凑零钱问题认识 最优子结构

问题描述:

有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) 个硬 币凑出该⾦额。

然后确定选择并择优</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值