基于求解最少硬币问题之python解法

题目描述

挑战介绍

实现一个算法求解最少硬币问题。介绍如下:

  • 假设有面值给定的一些硬币,以及给定的总合值,问构成总合值需要的最少的硬币数量是多少。
  • 例如硬币面值为 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

代码示例

分析

代码的思路分析:

  1. 输入验证

    • 首先,代码会检查输入的硬币列表和总金额是否有效,如果硬币列表为空或总金额为0,则会引发 TypeError 异常。
  2. 动态规划数组初始化

    • 创建一个动态规划数组 dp,数组长度为 total + 1,初始值设置为正无穷。这个数组用来存储达到每个金额所需的最小硬币数量。
  3. 基础情况初始化

    • 将 dp[0](总金额为0时)设为0,因为不需要任何硬币来凑成总金额为0。
  4. 状态转移方程

    • 通过两层循环,从总金额为1开始逐步计算到总金额为 total 的最小硬币数。内层循环遍历硬币列表中的每个硬币,尝试用当前硬币凑出总金额 i
  5. 更新最小值

    • 对于每个金额 i,通过比较使用当前硬币和不使用当前硬币的情况下,选择硬币数量更少的方案更新 dp[i]
  6. 返回结果

    • 最后,返回 dp[total],即总金额为 total 时所需的最小硬币数量。

通过动态规划的思想,不断更新每个金额所需的最小硬币数,最终得到总金额为 total 时所需的最小硬币数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值