题目描述
挑战介绍
实现一个算法求解最少硬币问题。介绍如下:
- 假设有面值给定的一些硬币,以及给定的总合值,问构成总合值需要的最少的硬币数量是多少。
- 例如硬币面值为
1
、2
和3
,给定总和为3
,需要的最少硬币为1
个,给定总和为5
则需要的最少硬币数为2
。
挑战内容
本次挑战中,你需要在 change_min.py
文件中补充类 CoinChanger
的空缺部分。
CoinChanger
中的make_change
方法用于求解最少硬币问题。make_change
函数的参数coins
用于指定输入的硬币面值。面值为数组形式,数组的元素为表示面值的数字。make_change
函数的参数total
用于指定总合值。make_change
函数需要返回表示得到硬币数目的数字。- 如果传入的
coins
或total
为None
,需要使用raise
语句显示TypeError
代码示例
分析
代码的思路分析:
-
输入验证:
- 首先,代码会检查输入的硬币列表和总金额是否有效,如果硬币列表为空或总金额为0,则会引发
TypeError
异常。
- 首先,代码会检查输入的硬币列表和总金额是否有效,如果硬币列表为空或总金额为0,则会引发
-
动态规划数组初始化:
- 创建一个动态规划数组
dp
,数组长度为total + 1
,初始值设置为正无穷。这个数组用来存储达到每个金额所需的最小硬币数量。
- 创建一个动态规划数组
-
基础情况初始化:
- 将
dp[0]
(总金额为0时)设为0,因为不需要任何硬币来凑成总金额为0。
- 将
-
状态转移方程:
- 通过两层循环,从总金额为1开始逐步计算到总金额为
total
的最小硬币数。内层循环遍历硬币列表中的每个硬币,尝试用当前硬币凑出总金额i
。
- 通过两层循环,从总金额为1开始逐步计算到总金额为
-
更新最小值:
- 对于每个金额
i
,通过比较使用当前硬币和不使用当前硬币的情况下,选择硬币数量更少的方案更新dp[i]
。
- 对于每个金额
-
返回结果:
- 最后,返回
dp[total]
,即总金额为total
时所需的最小硬币数量。
- 最后,返回
通过动态规划的思想,不断更新每个金额所需的最小硬币数,最终得到总金额为 total
时所需的最小硬币数量。