Python换钱的最少货币数
题目:
给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,代表要找的钱数,求组成aim的最少货币数。
例:
arr = [5, 2, 3],aim = 20,arr中组成20的最少张数为4,返回4。
arr = [5, 2, 3],aim = 0,不用任何货币就可以组成0,返回0。
arr = [3, 5],aim = 2,钱找不开返回-1 。
思路:
假设arr = [5, 2, 3],aim=10。
建立一个N*(M+1)的矩阵dp,N为arr里的个数,M=aim,dp[i][j]表示由当前行及该行上面所有行的货币种类兑换该列值的最少货币数,所在的列即需要兑换的钱数,dp初始化如下:
行\列 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
首先,计算第一行可兑换的钱数,即用5能兑换的钱数,其它不可兑换的钱数用max表示,如下:
行\列 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
5 | 0 | max | max | max | max | 1 | max | max | max | max | 2 |
2 | |||||||||||
3 |
计算其它位置。对于dp[i][j],当前i行兑换j钱数时,m为i行对应的货币值,若dp[i][j]可以兑换开,则dp[i][j-m]位置也可以兑换,此时dp[i][j] = dp[i][j-m] + 1。同时需要对比上一行兑换该钱数使用的货币数,即dp[i-1][j]的值,取两者的最小值,即为最少货币数。用这个方法处理第二行,前两行显示如下:
行\列 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
5 | 0 | max | max | max | max | 1 | max | max | max | max | 2 |
2 | 0 | max | 1 | max | 2 | 1 | 3 | 2 | 4 | 3 | 2 |
3 |
用同样的方法处理第三行,如下:
行\列 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
5 | 0 | max | max | max | max | 1 | max | max | max | max | 2 |
2 | 0 | max | 1 | max | 2 | 1 | 3 | 2 | 4 | 3 | 2 |
3 | 0 | max | 1 | 1 | 2 | 1 | 2 | 2 | 2 | 3 | 2 |
代码:
使用python实现上面的过程,如下:
import sysdef min_coins(arr, aim):if arr==None or len(arr)==0 or aim<0:return -1n = len(arr)max = sys.maxsizedp = [[0]*(aim+1) for i in range(n)]for j in range(1, aim+1):dp[0][j] = maxif (j-arr[0])>=0 and dp[0][j-arr[0]]!=max:dp[0][j] = dp[0][j-arr[0]] + 1for i in range(1,n):for j in range(1, aim+1):temp = maxif (j-arr[i])>=0 and dp[i][j-arr[i]]!=max:temp = dp[i][j-arr[i]] + 1dp[i][j] = min(temp, dp[i-1][j])return dp[n-1][aim] if dp[n-1][aim]!=max else -1
输入arr和aim,调用上面的方法查看结果:
arr = [5, 2, 3]
aim = 10
res = min_coins(arr, aim)
print('换钱的最少货币数为:', res)
结果如下:
换钱的最少货币数为: 2
若要查看dp矩阵的元素,可在输出前打印,或者同最少货币数一起返回。
参考:《程序员代码面试指南》左程云
Python换钱的最少货币数相关推荐
- 牛客题霸 [ 换钱的最少货币数] C++题解/答案
牛客题霸 [ 换钱的最少货币数] C++题解/答案 题目描述 给定数组arr,arr中所有的值都为正整数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱 ...
- 最少钱币数不java,【动态规划专题】3:换钱的最少货币数
<程序员代码面试指南--IT名企算法与数据结构题目最优解> 左程云 著 换钱的最少货币数 [题目] 给定数组arr, arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的 ...
- java 最少货币单元组合换钱_动态规划. 换钱的最少货币数和最多方法数
通过对换钱类题目的学习,我们将了解到 暴力递归及优化方法 记忆搜索(优化一) 动态规划的基本实现方法(优化二) 动态规划的空间优化(优化三) 1. 换钱的最少货币数,货币可重复使用 给定数组arr,a ...
- python 货币合适_算法之Python实现 - 001 : 换钱的最少货币数
[题目]给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. [代码1]:时间与额外 ...
- 牛客 换钱的最少货币数
题目链接:https://www.nowcoder.com/practice/4e05294fc5aa4d4fa8eacef2e606e5a8?tpId=101&tqId=33080& ...
- 动态规划问题——换钱的最少货币数
题目: 给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,在给定一个整数aim,代表要找的钱数,求组成aim的最少货币数. 示例: arr = ...
- 换钱的最少货币数(NC126/考察次数Top69/难度简单)
描述: 给定数组arr,arr中所有的值都为正整数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数. 如果无解,请返回-1. ...
- 算法:换钱的最少货币数
题目 给定数组arr,arr中所有的值都为正整数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数. 输入 输入包括两行,第一 ...
- [动态规划] 换钱的最少货币数
算法专题导航页面 [题目描述] 给定数组arr,arr中所有的值都为正整数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少 ...
最新文章
- 求字符串中汉字的个数
- 【转】js控制div层背景半透明
- PyTorch Upsample() 函数实现上采样
- C++之手写strlen函数
- Powershell-创建Module
- 性能优化(8):使用javascript缓存查询结果
- HR搬程序员椅子拍老板马屁,开怼的程序员被开?
- 宁德时代是前8个月全球最大电动汽车电池供应商
- 剑指Offer_47_求1+2+3+...+n
- MVC系统的Filter
- 使用Lucene检索文档中的关键字
- 网页中怎样制作虚线表格
- solr 6.4 mysql_solr6.4.1搜索引擎(2)首次同步mysql数据库
- secp256r1 c语言程序,区块链中的数学-secp256k1点压缩和公钥恢复原理
- 图标字体化 android,Android 优化 图标文字 iconfont
- 单片机开发需要的工具以及软件有哪些
- Word文字的三种隐藏方法
- 基于Nebula3的游戏: 龙歌:黑暗之眼 试玩下载
- Android Car - 开机画面
- 信捷服务器Z相信号,信捷plc标记与中断处理小知识