【动态规划】322. 零钱兑换

这篇具有很好参考价值的文章主要介绍了【动态规划】322. 零钱兑换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

322. 零钱兑换

动态规划-自顶向下

  • 定义 要凑出金额n 至少要dp(coins,n)个硬币
  • 确定base case 目标金额为0 返回0
  • 确定 状态 也就是原问题和子问题中的变量,你每次抽取一个硬币,都会导致目标金额减少,所以状态就是目标金额
  • 确定选择,也就是导致状态产生变化的行为,每次选一个硬币都会导致目标金额的减少
  • 明确dp数组的定义,状态数组的每一个值都是代表目标金额

class Solution {
    int[] memo;
    public int coinChange(int[] coins, int amount) {
        // 创建子问题状态数组
        memo = new int[amount + 1];

        Arrays.fill(memo,-666);// 初始化一个特殊值 表示还没有计算

        // 题目要求的最终结果就是dp
        return dp(coins,amount);
    }

    // 定义 要凑出金额n 至少要dp(coins,n)个硬币
    // dp状态是  变化的 也就是原问题和子问题的变量  由于硬币数量无限,仔细想一下  你每次抽取一个硬币 变化的是什么 目标总金额  抽取硬币的次数就是状态数组的长度  每次抽取 状态变量都会变化
    int dp(int[] coins,int amount){
        // base case
        if(amount == 0){
            return 0;
        }

        if(amount < 0){
            return -1;
        }

        if(memo[amount] != -666){
            return memo[amount];// 查找子问题的解
        }

        int res = Integer.MAX_VALUE;
        for(int coin: coins){
            // 拿走一个硬币 计算子问题的解
            int sub  = dp(coins,amount - coin);

            // 子问题无解 就跳过
            if(sub == -1){
                continue;
            }

            // 更新解  因为需要最少拿走硬币的次数
            res = Math.min(res,sub + 1);
        }


        // 将计算结果存入 子问题数组
        memo[amount] = (res == Integer.MAX_VALUE) ? -1:res;
        return res == Integer.MAX_VALUE ? -1:res;
    }
}

动态规划-自底向上

  • 状态数组的每一个状态都是代表目标金额
  • 外层for循环遍历所有状态的所有取值
  • 内层for循环遍历所有状态的所有取值
class Solution {
    public int coinChange(int[] coins, int amount) {
        // int[] dp = new int[amount + 1];

        // 数组大小是  amount + 1
        int[] dp = new int[amount + 1];
        Arrays.fill(dp,amount + 1);

        // base case
        dp[0] = 0;

        // 外层for循环在遍历所有状态的所有取值  每一个状态都是目标金额
        for(int i = 0; i < dp.length; i++){
            // 内层for循环遍历所有状态的所忧取值
            for(int coin:coins){
                // 子问题误解 直接跳过
                if(i - coin < 0){
                    continue;
                }

                dp[i] = Math.min(dp[i], dp[i - coin] + 1);
            }
        }

        return (dp[amount] == amount + 1) ? -1 : dp[amount];
    }
}

文章来源地址https://www.toymoban.com/news/detail-691594.html

到了这里,关于【动态规划】322. 零钱兑换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode 322. 零钱兑换

             本题属于完全背包问题,但要求最少的硬币个数。于是设定dp数组的含义dp[i]:总金额为i时,能凑成i的最少硬币个数。  需要注意初始化dp数组时,除0以外的其他地方需要初始化为INT_MAX以保证在递推过程中能被正确的覆盖。           代码如下:         ps:本题

    2024年02月12日
    浏览(31)
  • leetcode 动态规划(爬楼梯、零钱兑换、完全平方数)

    卡码网:57. 爬楼梯(opens new window) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 = m n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 输入描述:输入共一行,包含两个正整数,分别表示n, m 输出描述:输出一个整数,表

    2024年01月17日
    浏览(40)
  • leetcode动态规划(零钱兑换II、组合总和 Ⅳ)

    给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3, coins = [2] 输出: 0 解释: 只用面

    2024年02月01日
    浏览(41)
  • LeetCode518. 零钱兑换 II 以及 动态规划相关的排列组合问题

    一、题目 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整数。 示例 1: 示

    2024年02月09日
    浏览(42)
  • 【LeetCode动态规划#08】完全背包问题实战与分析(零钱兑换II)

    力扣题目链接(opens new window) 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3

    2023年04月19日
    浏览(44)
  • 算法训练Day45:70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

    Category Difficulty Likes Dislikes ContestSlug ProblemIndex Score algorithms Easy (54.04%) 2993 0 - - 0 Tags 记忆  |  数学  |  动态规划 Companies 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 示例 2: 提示: 1 = n = 45

    2024年02月01日
    浏览(41)
  • 算法训练第四十五天|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

    题目链接:70. 爬楼梯 (进阶) 参考:https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85%E7%89%88%E6%9C%AC.html 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数

    2023年04月26日
    浏览(58)
  • 【LeetCode动态规划#08】完全背包问题实战与分析(零钱兑换II--求组合、组合总和IV--求排列)

    力扣题目链接(opens new window) 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3

    2023年04月19日
    浏览(40)
  • 算法题打卡day45-背包问题 | 70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

    70. 爬楼梯 - 力扣(LeetCode) 状态:查看思路后AC。 除了常规的可以爬一或二级台阶,当题目稍微修改一下,变成可以爬m级台阶,之前的DP思路就有局限(dp[i] = dp[i-1] + dp[i-2),为了通杀这类问题,可以将题目转换为完全背包问题,可以爬的楼梯级数就是背包中的物品,楼梯总

    2024年02月11日
    浏览(46)
  • 算法 DAY44 动态规划6 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ

    有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。 动规五步曲来分

    2024年02月01日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包