前言
今天我们继续讨论经典的动态规划问题之找零钱问题。
找零钱问题
问题描述
假设你是一名超市收银员,现有
种不同面值的货币,每种面值的货币可以使用任意张。顾客结账时,你需要找给顾客
元零钱,你可以给出多少种方法。例如,有1、2、3元三种面值的货币,你需要找零3元,那么共有3种方法:1张1元+1张2元、3张1元、1张3元。
问题分析
假设长度为
的一维数组
,其中每个元素对应每种货币的面值。找零钱问题可以抽象为使用
中的元素可以有多少种方法组成数值
。
简单的,我们可以遍历数组,对下标
的元素使用
(
)次, 计算剩余的数组元素和剩余数值满足要求的方法数。把每一次的方法数相加求和即为该问题的解。不难发现,每一次要求解的都是和父问题具有同样性质的子问题,即使用
中的元素有多少种方法组成数值
。
由此,很容易写出该问题的暴力搜索(即递归)方法和记忆搜索方法。但是如果要直接写出动态规划的状态转移方程可能需要费点功夫。不过,我们可以按照算法思想之动态规划(一)讨论的动态规划的一般步骤进行思考。
(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时

这篇博客探讨了使用动态规划解决找零钱问题的算法思想,详细介绍了如何通过阶段划分、确定状态和状态转移方程来解决这个问题,并提供了四种不同的代码实现,包括暴力搜索、记忆搜索和两种动态规划优化方法。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



