`

Coin Change

阅读更多
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, return -1.

Note:
You may assume that you have an infinite number of each kind of coin.

Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example 2:
coins = [2], amount = 3
return -1.

题目的意思是给定一些不同面值的硬币和一个数值,写一个方法来判断是否能用现有的硬币组成给定的数值。假设每个面值的硬币都有无限个,如果可以组成给定的数值,就返回最少硬币的个数,否则返回-1。

这道题属于动态规划的问题,如果不用动态规划在leetcode上也可以ac,但是速度比较慢。用哈希表记录一个差值,就是给定的数值amount > coins[i]时,每遍历完一遍都更新哈希表,知道找到结果。代码如下:
public class Solution {
    public int coinChange(int[] coins, int amount) {
        if(amount == 0) return 0;
        Arrays.sort(coins);
        int result = 1;
        HashSet<Integer> helper = new HashSet<Integer>();
        for(int i = 0; i < coins.length; i++) {
            if(coins[i] == amount) {
                return result;
            } else if(amount > coins[i]) {
                helper.add(amount - coins[i]);
            }
        }
        boolean flag = true;
        while(flag) {
            HashSet<Integer> newset = new HashSet<Integer>();
            result ++;
            for(int newAmount : helper)
                for(int coin : coins) {
                    if(newAmount == coin) {
                        return result;
                    } else if(newAmount > coin) {
                        if(newAmount - coin >= coins[0]) {
                            newset.add(newAmount - coin);
                        }
                    } else {
                        break;
                    }
                } 
            if(newset.isEmpty()) {
                flag = false;
            } else {
                helper = newset;
            }
        }
        return -1;
    }
}


接下来我们动态规划的方法做,我们用一个数组dp[]来表示从0到amount,如果coins[i] = x时,x属于0到amount,dp[x] = 1; 当 x > coins[i]时,我们要查看之前是否已经计算出总数为x-coins[i]的情况,如果已经计算出,dp[x] = Math.min(dp[i - coins[j]] + 1, dp[x]);如果没有计算出就继续查找。细节的地方需要注意,比如数组的初始化等,代码如下:
public class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1];
        for(int i = 1; i < dp.length; i++)
            dp[i] = Integer.MAX_VALUE;
        
        for(int i = 1; i < dp.length; i++) {
            for(int j = 0; j < coins.length; j++) {
                if(i - coins[j] == 0) {
                    dp[i] = 1;
                    break;
                } else if(i - coins[j] > 0) {
                    int val = dp[i - coins[j]];
                    if(val != Integer.MAX_VALUE) {
                        dp[i] = Math.min(dp[i], val + 1);
                    }
                }
            }
        }
        return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
    }
}
分享到:
评论

相关推荐

    p1-Coin-Change.rar_Change_coin change

    在计算机科学领域,"Coin Change"问题是一个经典的问题,它涉及到计算在给定一组不同面值的硬币时,组成特定总金额的最少硬币数量。这个问题源自实际生活中的找零场景,但它的理论意义远超其应用场景。在本篇讨论中...

    CoinChange.java

    CoinChange.java

    LeetCode-Coin-Change

    public int coinChange(int[] coins, int n) { if (n ) return -1; int[] dp = new int[n + 1]; Arrays.fill(dp, Integer.MAX_VALUE); dp[0] = 0; for (int coin : coins) { for (int i = coin; i ; i++) { ...

    change_sum.zip_SUM

    def coinChange(coins, amount): dp = [0] * (amount + 1) dp[0] = 1 # 金额为0时,有1种空集组合 for i in range(1, amount + 1): for coin in coins: if coin dp[i] += dp[i - coin] return dp[amount] ``...

    算法设计与分析.zip

    文件`coinchange.py` 和 `coinchange - 副本.py` 可能涉及的是找零问题,即给定一套硬币面额,求解最少数量的硬币组合,使得总价值等于给定的目标金额。这个问题通常用动态规划解决,通过维护一个状态数组记录到达...

    coin_change_problem

    ### 动态规划解决找零问题 #### 一、引言 找零问题是计算机科学中的一个经典问题,尤其是在算法设计领域。这个问题的核心是如何利用最少数量的硬币来组成某个特定金额。例如,如果需要找零12元,而手头有的硬币面额...

    c语言-leetcode题解之0322-coin-change

    c c语言_leetcode题解之0322_coin_change

    leetcode questions.pdf

    在这份资源中,我们将讨论四个leetcode问题的解决方案,包括_single element in a sorted array_、_coin change 2_、_largest palindrome product_和_find all duplicates in an array_。 Single Element in a ...

    python-leetcode面试题解之第322题零钱兑换.zip

    def coinChange(coins, amount): if amount return -1 coins.sort(reverse=True) # 先将硬币按值降序排列,便于处理 dp = [float('inf')] * (amount + 1) dp[0] = 0 for i in range(len(coins)): for j in ...

    贪婪算法的解读与代码实现_数学建模资料

    change.append(coin) return change if amount == 0 else "无法用现有硬币找零" coins = [1, 5, 10, 25] amount = 37 print(greedy_change(coins, amount)) # 输出:[25, 10, 1, 1] ``` 在这个例子中,我们试图...

    3、动态规划必练题(含解法).pdf

    Coin Change和Coin Change 2分别考虑是否允许无限个硬币和不完全填充目标金额的情况。 9. **Edit Distance** (编辑距离) 计算两个字符串之间的最小编辑操作次数,包括插入、删除和替换。使用二维动态规划,状态...

    FifthExper_算法零钱个数最少问题_

    零钱个数最少问题,也称为“ coin change problem ”,是一个经典的动态规划问题。我们可以使用动态规划的方法来解决它。动态规划是一种通过将复杂问题分解为更小的子问题来求解的方法。在零钱个数最少问题中,我们...

    算法分析与设计 最少硬币问题

    int coinChange(std::vector&lt;int&gt;& coins, int amount) { std::vector&lt;int&gt; d(amount + 1, INT_MAX); d[0] = 0; for (int i = 1; i ; ++i) { for (int coin : coins) { if (i &gt;= coin && d[i - coin] != INT_...

    多语言实现贪心算法详解:从钱币找零到哈夫曼编码的编程实践与应用场景分析

    print(coinChange(coins, amount)) # 输出可能的钱币组合数 ``` **详解**:此示例展示了如何使用贪心算法解决钱币找零问题。算法首先初始化一个数组`coin_count`来存储每种金额下可能的组合数。对于每种面额的钱币...

    c++硬币找钱问题.rar

    int coinChange(vector&lt;int&gt;& coins, int amount) { vector&lt;int&gt; dp(amount + 1, INT_MAX); // 初始化dp数组,用INT_MAX表示无法组成金额 dp[0] = 0; // 组成0元不需要任何硬币 for (int i = 1; i ; i++) { for...

    精选_基于JAVA的实现的16个硬币问题_源码打包

    在编程领域,硬币问题(Coin Change Problem)是一类经典的算法问题,主要涉及组合优化和动态规划。在基于JAVA的实现的16个硬币问题中,我们可以预见到一系列与计算理论、数据结构和算法相关的知识。以下是这些知识...

    2018年845回忆题(by隹聿)1

    5. 动态规划(Coin Change Problem): - 题目中提到的硬币找零问题是一个经典的动态规划问题。给定不同面值的硬币,求解最少数量的硬币组合以达到指定金额。 - 动态规划解决方案通常使用一个数组dp,其中dp[i]...

    找硬币问题

    在给定的代码中,`coinChange` 函数实现了上述逻辑。它接收硬币面值数组 `values`、硬币种类数 `valuesCounts`、目标金额 `money` 和一个初始化的 `coinsUsed` 数组作为参数。通过两层循环,第一层遍历所有金额,第...

    最小硬币问题的c语言代码

    最小硬币问题(Minimum Coin Change Problem)是一个经典的动态规划问题,常常被用来教授计算机科学中的算法设计。在现实生活中,这个问题通常表现为:给定不同面值的硬币,求解用最少数量的硬币组合成一个给定的...

    LeetCodeAgri.zip

    9. **贪心算法**:在一些具有局部最优解的问题中,贪心策略常常能获得全局最优解,例如"硬币找零"(Coin Change)问题。 10. **分治法**:分治法是一种将复杂问题分解为较小部分进行解决的策略,如"快速排序"...

Global site tag (gtag.js) - Google Analytics