首页 > 其他分享 >LeetCode 322 零钱兑换

LeetCode 322 零钱兑换

时间:2024-08-01 14:06:28浏览次数:13  
标签:遍历 硬币 int 322 零钱 amount 背包 LeetCode dp

题目描述

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1

你可以认为每种硬币的数量是无限的。

思路

这是一个完全背包问题,背包问题当满足:物品不限制放入背包的个数,就是完全背包问题。背包问题一般要注意两个顺序:

  1. 循环嵌套的顺序,是把遍历物品的循环放外层还是把遍历背包的循环放在外层。
  2. 遍历dp数组的先后顺序,是从前往后遍历还是从后往前遍历。

这道题使用一维dp,注意在遍历dp数组的时候要从前往后,因为一个物品可以放多次。

具体步骤

1 确定dp数组的意义

dp[j]表示当总金额为j时,最少用dp[j]枚硬币可以凑出来

2 确定状态转移方程

dp[j] = min{dp[j - coin] + 1} (coin <= j,且coin属于coins数组)

3 初始状态

由于这题是求最小值,所以初始值设置为正无穷,又根据状态转移方程可知,dp数组中下标较大的值是由下标较小的值+1得到,所以dp[0]初始值应该设置为0。

代码

class Solution {
    public int coinChange(int[] coins, int amount) {
        if (amount == 0) return 0;
        int[] dp = new int[amount + 1];
        //dp[j]表示要将总金额凑成amount所需要的最少硬币数
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for (int i = 0; i < coins.length; i++) {
            for (int j = coins[i]; j <= amount; j++) {
                if (dp[j - coins[i]] != Integer.MAX_VALUE) {
                    dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
                }
            } 
        }
        return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
    }
}

标签:遍历,硬币,int,322,零钱,amount,背包,LeetCode,dp
From: https://www.cnblogs.com/zawaludo/p/18336537

相关文章

  • 每日一题:Leetcode-48 旋转图像
    力扣题目解题思路java代码力扣题目:给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转90度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例1:输入:matrix=[[1,2,3],[4,5,6]......
  • LeetCode 2024/8 每日一题合集
    2024-7-1LCP40.心算挑战代码实现classSolution{public:intmaxmiumScore(vector<int>&cards,intcnt){intn=size(cards);std::sort(cards.rbegin(),cards.rend());intsum=std::accumulate(cards.begin(),cards.begin()......
  • 两数之和(LeetCode题)
    题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=......
  • LeetCode 3111. 覆盖所有点的最少矩形数目(贪心、排序)
    题目:3111.覆盖所有点的最少矩形数目思路:只需关注横坐标,对横坐标进行升序排序,然后进行贪心,求得最少的矩阵数量classSolution{public:intminRectanglesToCoverPoints(vector<vector<int>>&points,intw){vector<int>v;for(inti=0;i<poi......
  • Leetcode每日一题 20240731 3111.覆盖所有点的最少矩阵数目
    题目描述给你一个二维整数数组point,其中points[i]=[xi,yi]表示二维平面内的一个点。同时给你一个整数w。你需要用矩形覆盖所有点。每个矩形的左下角在某个点(x1,0)处,且右上角在某个点(x2,y2)处,其中x1<=x2且y2>=0,同时对于每个矩形都必须满足x2......
  • leetcode20.有效的括号、华为OD机试-(C卷,100分)- 表达式括号匹配
    leetcode20.有效的括号题目描述给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例1:输入:s=“()......
  • LeetCode | 27 RemoveElement
    https://github.com/dolphinmind/datastructure/tree/datastructure-array主类packagecom.github.dolphinmind.array.binarysearch;/***@authordolphinmind*@ClassNameRemoveElement*@description27移除元素*移除元素分析*快......
  • LeetCode | 977 SquaresOfASortedArray
    https://github.com/dolphinmind/datastructure/tree/datastructure-array主类packagecom.github.dolphinmind.array.binarysearch;/***@authordolphinmind*@ClassNameSquaresOfASortedArray*@description977.有序数组的平方*分析:有移除元素{......
  • LeetCode | 704 BinarySearch
    https://github.com/dolphinmind/datastructure/tree/datastructure-array主类packagecom.github.dolphinmind.array.binarysearch;/***@authordolphinmind*@ClassNameBinarySearch*@description704二分法搜索*前提条件:有序数组,且无重复元素......
  • *算法训练(leetcode)第三十五天 | 121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 I
    刷题记录*121.买卖股票的最佳时机贪心*动态规划122.买卖股票的最佳时机II贪心*动态规划*123.买卖股票的最佳时机III*121.买卖股票的最佳时机leetcode题目地址贪心找左侧最小值、右侧最大值(与最小值求差最大),求差即为最大利润。时间复杂度:......