动态规划算法求解硬币找零问题

本文介绍了如何利用动态规划算法解决硬币找零问题。以寻找总值为63元的零钱为例,当硬币面值为1、2、5、21、25元时,只需3个21元硬币即可。动态规划从T=1开始,计算最少硬币数并存储,通过比较找出最小解。算法中涉及values[](硬币面值数组)、valueKinds(硬币种类数)、money(找零面值)和dp[](存储最小硬币数)等关键变量。

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


硬币找零问题描述:现存在一堆面值为 V1、V2、V3 … 个单位的硬币,问最少需要多少个硬币才能找出总值为 T 个单位的零钱?假设这一堆面值分别为 1、2、5、21、25 元,需要找出总值 T 为 63 元的零钱。

很明显,只要拿出 3 个 21 元的硬币就凑够了 63 元了。

基于上述动态规划的思想,我们可以从 T=1 开始计算出最少需要几个硬币,然后再求 T=2 、T=3…每一次求得的结果都保存在一个数组中,以后需要用到时则直接取出即可。

从 T=1 开始依次找零时,可以尝试一下当前要找零的面值 T 是否能够被分解成 另一个已求解的面值的找零需要的硬币个数 再加上 这一堆硬币中的某个面值之和,如果这样分解之后最终的硬币数是最少的,那么问题就得到答案了。

单是上面的文字描述太抽象,先假定以下变量:

values[] : 保存每一种硬币的币值的数组
valueKinds :币值不同的硬币种类数量,即values[]数组的大小
money : 需要找零的面值
dp[] : 保存面值为 i 的纸币找零所需的最小硬币数

算法描述:

当求解总面值为 i 的找零最少硬币数 dp[i] 时,将其分解成求解 dp[i – cents] 和一个面值为 cents 元的硬币,由于 i – cents < i , 其解 dp[ i – cents] 已经在之前的循环中被算出,如果面值为 cents 的硬币满足题意,那么最终解 dp[i] 则等于 dp[i – cents] 再加上 1(即面值为 cents)的这一个硬币。

public class CoinsChange {
	/**
	 * 硬币找零:动态规划算法
	 * @param values:保存每一种硬币的币值的数组        
	 * @param valueKinds:币值不同的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值