算法:动态规划

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、问题描述

二、动态规划算法

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、问题描述

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

输入: coins = [1, 2, 5], amount = 11
输出: 3 
解释: 11 = 5 + 5 + 1

输入: coins = [2], amount = 3
输出: -1

二、动态规划算法

解题思路:

当我们拿到这个题目的时候,第一时间是想,总金额有多少种组合方式,然后再结合硬币金额进行匹配,但是这个方法可能性太多了,比较复杂。

换一种思路,不如我们先从1到amount,然后将每一个值需要的最少硬币数算好,然后逐步向最后的值靠拢

就拿这个例子来说:

先看1,刚好有1元硬币,最少硬币数是1

再看2,刚好有2元硬币,最少硬币数是1

再看3,比3小的硬币有两种,一种是1元,一种是2元,我们优先用2元的,还剩1元,那么我们找一下1元需要的最少硬币数,是不是第一步已经算出来了,1枚,加起来就是2

再看4,比4小的硬币有两种,一种是1元,一种是2元,我们优先用2元的,还剩2元,那么我们找一下2元需要的最少硬币数,是不是第二步已经算出来了,1枚,加起来就是2

再看5,小于等于5的硬币有三种,一种是1元,一种是2元,一种是5元,我们优先用最大面值5元的,还剩0元,最少硬币数是1

再看6,小于等于6的硬币有三种,一种是1元,一种是2元,一种是5元,我们优先用最大面值5元的,还剩1元,那么我们找一下1元需要的最少硬币数,是不是第一步已经算出来了,1枚,加起来就是2

......

最后看11,小于等于11的硬币有三种,一种是1元,一种是2元,一种是5元,我们优先用最大面值5元的,还剩6元,6元大于三种硬币最大的面值,那么再用一枚5元的,还剩1元,那么我们找一下1元需要的最少硬币数,是不是第一步已经算出来了,1枚,加起来就是3

这个分析的过程太香了!!!

代码示例:

public int coinChange(int[] coins, int amount) {
    // 初始化动态规划数组,长度为amount+1,初始值为amount+1,表示无法凑成该金额
    int[] dp = new int[amount + 1];
    for (int i = 0; i <= amount; i++) {
        dp[i] = amount + 1;
    }
    // 凑成金额0所需的硬币个数为0
    dp[0] = 0;

    // 遍历所有金额,更新dp数组
    for (int i = 1; i <= amount; i++) {
        // 遍历所有面额的硬币
        for (int j = 0; j < coins.length; j++) {
            // 如果当前金额大于等于当前面额的硬币,尝试使用该硬币
            if (i >= coins[j]) {
                // 更新dp数组,取最小值
                dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
            }
        }
    }

    // 如果dp[amount]仍为amount+1,表示无法凑成总金额,返回-1
    return dp[amount] > amount ? -1 : dp[amount];
}
  1. 初始化一个长度为总金额+1的数组dp,初始值都设为总金额+1,表示无法凑成该金额。dp[i]表示凑成金额i所需的最少硬币个数。

  2. 将dp[0]设为0,因为凑成金额0不需要任何硬币。

  3. 遍历所有金额,从1到总金额。对于每个金额i,遍历所有硬币面额,如果当前金额大于等于当前面额的硬币,尝试使用该硬币。

  4. 更新dp[i]的值,取dp[i]和dp[i-coins[j]]+1的最小值。dp[i-coins[j]]+1表示使用当前面额的硬币后,剩余金额需要的最少硬币个数。

  5. 遍历完所有金额后,如果dp[amount]仍为总金额+1,表示无法凑成总金额,返回-1。否则,返回dp[amount],即凑成总金额所需的最少硬币个数。


总结

注释已添加,快快动手练习吧,简单到有手就行!

相关推荐

  1. 动态规划算法介绍

    2024-01-03 15:36:01       68 阅读
  2. 算法动态规划

    2024-01-03 15:36:01       41 阅读
  3. 算法动态规划引入

    2024-01-03 15:36:01       40 阅读
  4. 算法——C/动态规划

    2024-01-03 15:36:01       30 阅读
  5. 动态规划-算法

    2024-01-03 15:36:01       17 阅读
  6. 算法动态规划

    2024-01-03 15:36:01       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-03 15:36:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-03 15:36:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-03 15:36:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-03 15:36:01       20 阅读

热门阅读

  1. setFirstResult ,setMaxResults

    2024-01-03 15:36:01       33 阅读
  2. pip安装报错SSL

    2024-01-03 15:36:01       45 阅读
  3. 简易版前端项目离线方案-接口及页面离线缓存

    2024-01-03 15:36:01       37 阅读
  4. C++ gRPC helloworld 示例代码

    2024-01-03 15:36:01       39 阅读
  5. 数据结构OJ实验7-树结构及应用

    2024-01-03 15:36:01       31 阅读
  6. MongoDB聚合:$addField

    2024-01-03 15:36:01       38 阅读
  7. 大数据系列之:读取parquet文件统计数据量

    2024-01-03 15:36:01       37 阅读
  8. Mac 彻底删除 node 和 npm

    2024-01-03 15:36:01       38 阅读
  9. 详解汇编cll ret push pop 并附源码

    2024-01-03 15:36:01       43 阅读
  10. MySQL5.7更新的内容

    2024-01-03 15:36:01       33 阅读
  11. 微服务(12)

    2024-01-03 15:36:01       36 阅读
  12. bash脚本从ini文件读取设置

    2024-01-03 15:36:01       41 阅读