java动态规划凑硬币问题_动态规划--凑硬币问题

本文通过实例解析Java动态规划解决凑硬币问题,分析动态规划的状态转移方程,探讨不同面值硬币对解题的影响,并提供代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

凑硬币问题

题目详情为:有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?

最近在学习一些重要算法,作为五大算法之一的动态规划法,自然要认真学习,这是一道典型的动态规划问题,这里使用动态规划法的思想来解题;

我们用d(i)=j来表示凑够i元最少需要j个硬币,通过题目,很容易得到:当i=0时,d(0)=0, 表示凑够0元最小需要0个硬币; 当i=1时,只有面值为1元的硬币可用, 因此我们拿起一个面值为1的硬币,接下来只需要凑够0元即可,而这个是已经知道答案的, 即d(0)=0,则有d(1) = d(1 - 1) + 1 = 1,凑够1元最少需要1个硬币,当i = 2时,d(2) = d(2 - 1) + 1= d(1) +1=2, 当i = 3时,d(3) = min{d(3 - 1) + 1 , d(3 - 3) + 1} = min(3, 1) = 1;动态规划算法通常基于一个递推公式及一个或多个初始状态。在这里d(i) 就是状态,通过分析推导的过程,可以得到,针对面值为1,3,5的硬币,可以得到递推公式(状态转移方程)为:

d(i) = min{ d(i - Vj) + 1} ,i >= Vj。

在动态规划中,得到了该问题的状态及其状态转移方程,问题已经解决了一大半了,然后,在分析的过程中,并不能一眼就看出递推公式,它需要更多的练习和更多的实践积累的,并不是一朝一夕能做到的,况且动态规划的关键就是找到状态和状态转移方程,那么容易找到,就不是动态规划了,就不是难点了。根据这个公式,我们可以比较轻易的写出实现的代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

/*@动态规划练习题

如果我们有面值为1元、3元和5元的硬币若干枚,如何用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值