LeetCode322. 零钱兑换//力扣322. 零钱兑换(贪心//动态规划//DFS//BFS)

news/2025/2/22 7:30:46

LeetCode322. 零钱兑换//力扣322. 零钱兑换(贪心//动态规划
 

来源:力扣(LeetCode)
链接:题目跳转

 

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

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

 

示例 1:

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

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

输入:coins = [1], amount = 0
输出:0
示例 4:

输入:coins = [1], amount = 1
输出:1
示例 5:

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

提示:

1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104

 

分析:

这道题综合性特别强,可以用背包(动态规划),贪心,深度遍历(dfs),广度遍历(bfs)

 

1:背包(动态规划

首先,背包的动态规划,就是取与不取的区别。

定义dp[n] 表示,金额为n元所需最少的金币数量。

题目说明:所有硬币是无限的

这里我们可以分析,如果存在一个硬币coin面额,有  n - coin > 0  所以,此时 dp[n-coin]  表示,金额为 n-coin 元所需最少的金币数量。所以,此时 dp[n] = dp[n-coin] + 1 ,加1表示加上一个面值为coin的硬币。

得出,只需满足dp[n] = min(dp[n] , dp[n-coin]+1);判断,当前的总额的最小硬币数,与减去一个硬币的总额的最小硬币数+1,的最小值。

dp初始条件:  dp[0] = 0; //凑0元,需要0个硬币。

 

上java代码:

public static int coinChange(int[] coins, int amount) {
        int max = amount + 1;//这里,定义最大值为amount+1,因为amount是要凑的面额,amount+1就是他的最大值了
        int[] dp = new int[amount + 1];
        Arrays.fill(dp, max);//所有数组赋值为最大值。
        dp[0] = 0;   //凑0元,需要0个硬币。
        
        //遍历每一个总额,其中是否有硬币满足
        for (int i = 1; i <= amount; i++) {
            for (int coin : coins) {
                if (i - coin < 0) {
                    continue;
                }
                dp[i] = Math.min(dp[i], dp[i - coin] + 1);
            }
        }
        //返回
        return dp[amount] == max ? -1 : dp[amount];
    }

 

 

 

 

 

 

 

 


http://www.niftyadmin.cn/n/864117.html

相关文章

Crawler4j学习笔记-util

Crawler4j学习笔记-util util有两个类&#xff0c;IO.java和Util.java。 IO.java用于文件的操作。 deleteFolder用于删除文件夹&#xff08;directory&#xff09;&#xff0c;实际通过deleteFolderContents删除文件夹下的文件&#xff0c;递归调用deleteFolder删除子文件夹…

LeetCode55跳跃游戏//力扣55跳跃游戏(贪心)

LeetCode55跳跃游戏//力扣55跳跃游戏(贪心&#xff09; 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;题目跳转 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你…

查看主板型号

这里mark下 首先运行dxdiag 其中的系统型号即为主板型号&#xff08;我的已停产&#xff0c;看来要换了&#xff09;

LeetCode45跳跃游戏 II//力扣45跳跃游戏 II(动态规划//贪心)

LeetCode45跳跃游戏 II//力扣45跳跃游戏 II&#xff08;动态规划//贪心&#xff09;来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;题目跳转 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃…

动态规划套路详解(我看过最好的)

原文来自&#xff1a; 作者&#xff1a;labuladong 链接&#xff1a;内容跳转 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 读完本文&#xff0c;你可以去力扣拿下如下题目&#xff1a; 509.斐波那契数 322.零钱兑换 这篇文章是我们号半年前一篇 200 多赞赏的成…

Java 8 函数式编程

《Java 8 函数式编程》的笔记 简单mark下里面的代码 习题解&#xff1a;https://github.com/RichardWarburton/java-8-lambdas-exercises 2.Lamba表达式 相当于匿名方法&#xff0c;代码即数据&#xff0c;闭包且适用于函数接口。 Lamba可应用在 匿名内部类 button.addAc…

Java读取pdf中文

直接使用系统字体读取或创建带中文的pdf&#xff0c;需要注意jar的版本。 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.8</version></dependency><dependency><grou…

简单了解Java本身是怎样判断一个文件是目录

起因是了解Common IO时看到FilenameUtils的类注释&#xff0c;里面说到FilenameUtils对带路径符才默认为目录&#xff08;文件夹&#xff09;&#xff0c;那Java本身是怎样判断一个文件是否目录的&#xff1f; Note that this class works best if directory filenames end wit…