写点什么

leetcode 322. Coin Change 零钱兑换 (中等)

作者:okokabcd
  • 2022 年 7 月 01 日
  • 本文字数:649 字

    阅读完需:约 2 分钟

leetcode 322. Coin Change 零钱兑换(中等)

一、题目大意

标签: 动态规划


https://leetcode.cn/problems/coin-change


给你一个整数数组 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


提示:


  • 1 <= coins.length <= 12

  • 1 <= coins[i] <= 231 - 1

  • 0 <= amount <= 104

二、解题思路

每个硬币可以用无限多次,所以是完全背包问题。dp[i]表示,达到总金额 i 所需的最少硬币数,因为求最少硬币数所以先将 dp 初始化为 amount+2,状态转移方程为:dp[i] = min(dp[i], dp[i-coin] + 1)

三、解题方法

3.1 Java 实现

public class Solution {    public int coinChange(int[] coins, int amount) {        if (coins.length == 0) {            return -1;        }        int[] dp = new int[amount + 1];        Arrays.fill(dp, amount + 2);        dp[0] = 0;        for (int i = 1; i <= amount; i++) {            for (int coin : coins) {                if (i >= coin) {                    dp[i] = Math.min(dp[i], dp[i - coin] + 1);                }            }        }        return dp[amount] == amount + 2 ? -1 : dp[amount];    }}
复制代码

四、总结小记

  • 2022/7/1 周五了,今天是个承上启下的日子

发布于: 刚刚阅读数: 3
用户头像

okokabcd

关注

还未添加个人签名 2019.11.15 加入

一年当十年用的Java程序员

评论

发布
暂无评论
leetcode 322. Coin Change 零钱兑换(中等)_LeetCode_okokabcd_InfoQ写作社区