动态规划入门-01(兑换钱币&&跳跃游戏)-js

本文介绍了动态规划的两个经典问题——兑换零钱和跳跃游戏,并提供了JavaScript代码实现。兑换零钱问题中,目标是找出用最少的货币数凑成给定金额;跳跃游戏中,判断是否能从数组的起始位置跳到最后一个位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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枚硬币组合来达到最小数量的要求
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值