1.兑换零钱(一)
描述
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.
示例1
输入:[5,2,3],20
返回值:4
代码实现:
function minMoney( arr , aim ) {
// write code here
/*
动态规划的解题步骤:
1。确定状态
假设最优解的最后一次去值是a,这个a可以是钱币数组中的任意面额
化成子问题就是(最少的钱币数量拼出最小的金额数量)
2.转移方程
假设当前给的钱币的金额分别是 2,5,7则需要拼出目标面额的钱所使用的最小数量
f[27] = min{f[27 - 2] + 1,f[27 - 5] + 1,f[27 -7] + 1}
3.初始化变量
f[0] = 0 因为需要拼出0元钱所需的钱币数量就是0
如果档期当前面额不能拼出来的话 就讲当前面额索引的数组值设置为无穷大f[Y] = 无穷大
4.计算顺序
一般来讲数据是从小到大计算
矩阵是从左向右再从上到下
*/
// js语法中数组从0开始如果要算到aim新建的数组就必须要比目标值大一个
// 创建数组用来保存从0 1 ... aim中每一个可以使用最少的给定的钱币面值的数量来表示的数据
let f = new Array(aim + 1)
f[0] = 0 // 初始化边界值 因为0元只能用0枚硬币组合来达到最小数量的要求