首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Haskell中计算给定变化量的最小硬币数

可以通过动态规划算法来实现。动态规划是一种通过将问题分解为更小的子问题并解决它们来解决复杂问题的方法。

首先,我们需要定义一个函数来计算最小硬币数。假设我们有一个硬币列表 coins,其中包含不同面额的硬币。我们可以使用递归函数来实现这个算法。

代码语言:txt
复制
minCoins :: Int -> [Int] -> Int
minCoins 0 _ = 0
minCoins amount coins = minimum [1 + minCoins (amount - c) coins | c <- coins, c <= amount]

上述代码中,minCoins 函数接受两个参数:amount 表示需要找零的金额,coins 表示可用的硬币列表。当 amount 为 0 时,表示已经找零完成,返回 0。否则,我们遍历硬币列表 coins,选择一个面额不大于 amount 的硬币 c,然后递归调用 minCoins 函数计算剩余金额 (amount - c) 的最小硬币数,并加上当前选择的硬币数 1。最后,我们取所有可能的最小硬币数中的最小值。

例如,假设我们有硬币列表 [1, 2, 5],需要找零的金额为 11。调用 minCoins 函数:

代码语言:txt
复制
minCoins 11 [1, 2, 5]

首先,我们选择面额为 1 的硬币,剩余金额为 10。然后,我们递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 10 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 9。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 9 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 8。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 8 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 7。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 7 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 6。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 6 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 5。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 5 [1, 2, 5]

这次,我们选择面额为 5 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 2 的硬币,剩余金额为 3。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 3 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 2。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 2 [1, 2, 5]

这次,我们选择面额为 2 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 5 的硬币,剩余金额为 1。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 1 [1, 2, 5]

这次,我们选择面额为 1 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 2 的硬币,剩余金额为 1。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 1 [1, 2, 5]

这次,我们选择面额为 1 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 5 的硬币,剩余金额为 6。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 6 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 5。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 5 [1, 2, 5]

这次,我们选择面额为 5 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 2 的硬币,剩余金额为 3。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 3 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 2。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 2 [1, 2, 5]

这次,我们选择面额为 2 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 5 的硬币,剩余金额为 1。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 1 [1, 2, 5]

这次,我们选择面额为 1 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 2 的硬币,剩余金额为 1。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 1 [1, 2, 5]

这次,我们选择面额为 1 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 5 的硬币,剩余金额为 11。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 11 [1, 2, 5]

这次,我们选择面额为 2 的硬币,剩余金额为 9。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 9 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 8。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 8 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 7。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 7 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 6。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 6 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 5。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 5 [1, 2, 5]

这次,我们选择面额为 5 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 2 的硬币,剩余金额为 3。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 3 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 2。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 2 [1, 2, 5]

这次,我们选择面额为 2 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 5 的硬币,剩余金额为 1。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 1 [1, 2, 5]

这次,我们选择面额为 1 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 2 的硬币,剩余金额为 1。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 1 [1, 2, 5]

这次,我们选择面额为 1 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 5 的硬币,剩余金额为 6。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 6 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 5。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 5 [1, 2, 5]

这次,我们选择面额为 5 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 2 的硬币,剩余金额为 3。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 3 [1, 2, 5]

继续选择面额为 1 的硬币,剩余金额为 2。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 2 [1, 2, 5]

这次,我们选择面额为 2 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 5 的硬币,剩余金额为 1。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 1 [1, 2, 5]

这次,我们选择面额为 1 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 2 的硬币,剩余金额为 1。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 1 [1, 2, 5]

这次,我们选择面额为 1 的硬币,剩余金额为 0。根据初始定义,minCoins 0 _ 返回 0。然后,我们回溯到上一层递归调用,继续选择面额为 5 的硬币,剩余金额为 11。再次递归调用 minCoins 函数:

代码语言:txt
复制
minCoins 11 [1, 2, 5]

最终,我们得到最小硬币数为 3。

在这个例子中,我们使用了面额为 1、2 和 5 的硬币,找零金额为 11。通过动态规划算法,我们计算出最小硬币数为 3。

对于这个问题,腾讯云提供了云原生计算服务,可以帮助开发者构建和管理云原生应用。具体推荐的产品和产品介绍链接如下:

  1. 云原生计算服务:提供了一站式的云原生应用开发、部署和运维解决方案。链接:https://cloud.tencent.com/product/tke
  2. 云服务器(CVM):提供了可扩展的计算容量,适用于各种规模的应用程序。链接:https://cloud.tencent.com/product/cvm
  3. 云数据库 MySQL 版:提供了高性能、可扩展的关系型数据库服务。链接:https://cloud.tencent.com/product/cdb_mysql
  4. 云存储(COS):提供了安全、可靠的对象存储服务,适用于存储和处理大规模的非结构化数据。链接:https://cloud.tencent.com/product/cos
  5. 人工智能服务:提供了丰富的人工智能能力,包括图像识别、语音识别、自然语言处理等。链接:https://cloud.tencent.com/product/ai_services

通过使用这些腾讯云的产品,开发者可以更轻松地构建和部署云原生应用,并且享受到高性能、可靠性和安全性的优势。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

js算法初窥05(算法模式02-动态规划与贪心算法)

在前面的文章中(js算法初窥02(排序算法02-归并、快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而动态规划则是把问题分解成互相依赖的子问题。   那么我还有一个疑问,前面讲了递归,那么递归呢?分治法和动态规划像是一种手段或者方法,而递归则是具体的做操作的工具或执行者。无论是分治法还是动态规划或者其他什么有趣的方法,都可以使用递归这种工具来“执行”代码。   用动态规划来解决问题主要分为三个步骤:1、定义

03

一文说清动态规划

动态规划(dynamic programming,简称 dp)是工程中非常重要的解决问题的思想,从我们在工程中地图软件上应用的最短路径问题,再在生活中的在淘宝上如何凑单以便利用满减券来最大程度地达到我们合理薅羊毛的目的 ,很多时候都能看到它的身影。不过动态规划对初学者来说确实比较难,dp状态,状态转移方程让人摸不着头脑,网上很多人也反馈不太好学。其实任何算法的学习都是有它的规律和套路的,只要掌握好它的规律及解题的套路,再加上大量的习题练习,相信掌握它不是什么难事。本文将会用比较浅显易懂地讲解来帮助大家掌握动态规划这一在工程中非常重要的思想,相信看完后,动态规划的解题套路一定能手到擒来(文章有点长,建议先收藏再看,看完后一定会对动态规划的认知上升到一个台阶!)

01

一文学会动态规划解题技巧

动态规划(dynamic programming,简称 dp)是工程中非常重要的解决问题的思想,从我们在工程中地图软件上应用的最短路径问题,再在生活中的在淘宝上如何凑单以便利用满减券来最大程度地达到我们合理薅羊毛的目的 ,很多时候都能看到它的身影。不过动态规划对初学者来说确实比较难,dp状态,状态转移方程让人摸不着头脑,网上很多人也反馈不太好学,其实就像我们之前学递归那样,任何算法的学习都是有它的规律和套路的,只要掌握好它的规律及解题的套路,再加上大量的习题练习,相信掌握它不是什么难事,本文将会用比较浅显易懂地讲解来帮助大家掌握动态规划这一在工程中非常重要的思想,相信看完后,动态规划的解题套路一定能手到擒来(文章有点长,建议先收藏再看,看完后一定会对动态规划的认知上升到一个台阶!)

02

一文学会动态规划解题技巧

动态规划(dynamic programming,简称 dp)是工程中非常重要的解决问题的思想,从我们在工程中地图软件上应用的最短路径问题,再在生活中的在淘宝上如何凑单以便利用满减券来最大程度地达到我们合理薅羊毛的目的 ,很多时候都能看到它的身影。不过动态规划对初学者来说确实比较难,dp状态,状态转移方程让人摸不着头脑,网上很多人也反馈不太好学,其实就像我们之前学递归那样,任何算法的学习都是有它的规律和套路的,只要掌握好它的规律及解题的套路,再加上大量的习题练习,相信掌握它不是什么难事,本文将会用比较浅显易懂地讲解来帮助大家掌握动态规划这一在工程中非常重要的思想,相信看完后,动态规划的解题套路一定能手到擒来(文章有点长,建议先收藏再看,看完后一定会对动态规划的认知上升到一个台阶!)

04
领券