力扣题322零钱兑换(完全背包问题)
发布日期:2022-03-04 11:48:17 浏览次数:6 分类:技术文章

本文共 1959 字,大约阅读时间需要 6 分钟。

给你一个整数数组 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.首先想到的就是递归,可以通过例子,但是提交后显示栈溢出,说明递归的层数过多了,由于硬币1的存在,可能在面对一个很大的目标amount时会导致栈溢出。

class Solution {    int minNum;    public int coinChange(int[] coins, int amount) {        minNum = amount + 1;        coinChange(coins,amount,0,0);        if (minNum > amount) { //此时说明没有找到兑换的方法            return -1;        } else { //找到了兑换的方法            return minNum;        }    }    //递归求解    public void coinChange(int[] coins,int amount,int currentAmount,int currentNum) {        if (currentAmount == amount) {//如果当前amount等于目标aomunt,说明找到了一种兑换方法            minNum = Math.min(minNum,currentNum);            return;        }        if (currentAmount > amount) {//当前amount大于目标amount,直接return            return;        }        for (int i = 0;i < coins.length;i++) {            coinChange(coins,amount,currentAmount + coins[i],currentNum + 1);        }    }}

2.进一步想到完全背包问题,背包里面就是很多零钱,并且可以无限使用,就是说当前取的硬币可以是coins数组中的任意一个硬币。

        动态规划:用一个数组dp[i]表示组成当前值i的最少硬币数量,每一次都可以选择取当前值或

      者不取,即dp[i] = min{dp[i],dp[i-coin] + 1}

class Solution {    public int coinChange(int[] coins, int amount) {        int max = amount + 1;         int[] dp = new int[amount + 1];//表示amount为i时可以使用的最小硬币数量        Arrays.fill(dp,max);//加上一个最大值        dp[0] = 0;//amout为0,就不需要硬币,即硬笔数为0        for (int i = 1;i <= amount;i++) {            for (int j = 0;j < coins.length;j++) {                if (coins[j] <= i) {//如果当前硬币价值不超过amout,就可以取                    dp[i] = Math.min(dp[i],dp[i-coins[j]] + 1);                }            }        }        if (dp[amount] > amount) {//如果最大值大于amount,说明没有找到,返回-1            return -1;        } else {             return dp[amount];        }    }}

题源:

转载地址:https://blog.csdn.net/xxyneymar/article/details/122034426 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:力扣题312戳气球
下一篇:力扣213打家劫舍II

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月12日 08时48分07秒