零钱兑换

题目

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

示例 1:

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

示例 2:

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

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

代码

思路:动态规划
假设conis={c1,c2,...},那么f(n)=min{f(n-c1),f(n-c2),...}+1,遍历的过程中用数组记录计算过的值。
public class 零钱兑换 {
    public static int coinChange(int[] coins, int amount) {
        int[] count=new int[amount+1];
        for(int i:coins){
            if(i<=amount){
                count[i]=1;//面值比总和还大的肯定用不上
            }
        }
        return solve(coins,amount,count);
    }
    public static int solve(int[]coins,int amount,int[] count){
        if(amount<0){
            return -1;
        }
        if(amount==0){
            return 0;
        }
        if(count[amount]!=0){
            return count[amount];//返回计算过的值
        }
        int min=Integer.MAX_VALUE;
        int temp;
        for(int i:coins){
            temp=solve(coins,amount-i,count);
            if(temp!=-1&&min>temp){
                min=temp;
            }
        }
        return count[amount]=min!=Integer.MAX_VALUE?min+1:-1;

    }
    public static void main(String[] args){
        int[] coins={1,2,5};
        int amount=11;
        System.out.println(coinChange(coins,amount));
    }
}

原文地址:https://www.cnblogs.com/xiangguoguo/p/10856005.html

时间: 2024-11-03 19:08:22

零钱兑换的相关文章

SICP 习题 (2.19) 解题总结:重写零钱兑换程序

SICP 习题2.19 要求我们重新设计1.2.2节的零钱兑换程序,要求我们可以轻易改变程序里用的兑换币种. 我们先看看1.2.2节的零钱兑换程序,代码是这样的: (define (RMB-Change amount) (format #t "Changing ~S~%" amount) (cond ((= amount 0) 0) ((< amount 0) 0) (else (RMB-Change-Recursive amount 1 '() )))) (define (RM

LeetCode:零钱兑换【322】【DP】

LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明:你可以认为每种硬币的数量是无限的. 题目分析 很显然,这是

leetcode 322 零钱兑换

目录 1. 题目 2. 解法 2.1. 暴力穷举 2.2. 动态规划-1 自下而上 2.3. 动态规划-2 自上而下 3. 代码及测试结果 3.1. 测试代码: 3.2. 结果: 1. 题目 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1

leetcode 322零钱兑换

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins,

(Java) LeetCode 322. Coin Change —— 零钱兑换

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins,

[Swift]LeetCode322. 零钱兑换 | Coin Change

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins,

动态规划LeetCode322零钱兑换

题目描述: 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: coins = [1, 2, 5], amount = 11输出: 3 解释: 11 = 5 + 5 + 1示例 2: 输入: coins = [2], amount = 3输出: -1说明:你可以认为每种硬币的数量是无限的. 思路: 利用贪心算法可以吗? 算法思路: 1 class Solution

[LeetCode]322. 零钱兑换(DP)

题目 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回?-1. 示例?1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明: 你可以认为每种硬币的数量是无限的. 来源:力扣(LeetCode) 链接:https://leetcode

322.零钱兑换(动态规划)

给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/coin-change著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 以前我会直接贪婪算法,然后解不出来,现在第一想法就是动态规划:把每一步的最优解都算出来,取最后一项返回. 本题状态转移方程: dp[ i ]