java 动态规划找零钱_算法思想之动态规划(三)——找零钱问题

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

前言

今天我们继续讨论经典的动态规划问题之找零钱问题。

找零钱问题

问题描述

假设你是一名超市收银员,现有

math?formula=n种不同面值的货币,每种面值的货币可以使用任意张。顾客结账时,你需要找给顾客

math?formula=aim元零钱,你可以给出多少种方法。例如,有1、2、3元三种面值的货币,你需要找零3元,那么共有3种方法:1张1元+1张2元、3张1元、1张3元。

问题分析

假设长度为

math?formula=n的一维数组

math?formula=penny,其中每个元素对应每种货币的面值。找零钱问题可以抽象为使用

math?formula=penny中的元素可以有多少种方法组成数值

math?formula=aim

简单的,我们可以遍历数组,对下标

math?formula=index的元素使用

math?formula=i(

math?formula=0%20%5Cleq%20i%20%5Cleq%20aim%20%2F%20penny%5Bindex%5D)次, 计算剩余的数组元素和剩余数值满足要求的方法数。把每一次的方法数相加求和即为该问题的解。不难发现,每一次要求解的都是和父问题具有同样性质的子问题,即使用

math?formula=penny%5Bindex%3An-1%5D中的元素有多少种方法组成数值

math?formula=aim%20-%20i%20*%20penny%5Bindex%5D

由此,很容易写出该问题的暴力搜索(即递归)方法和记忆搜索方法。但是如果要直接写出动态规划的状态转移方程可能需要费点功夫。不过,我们可以按照算法思想之动态规划(一)讨论的动态规划的一般步骤进行思考。

(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值