Day87 零錢兌換

給定不同面額的硬幣 coins 和一個(gè)總金額 amount。編寫一個(gè)函數(shù)來計(jì)算可以湊成總金額所需的最少的硬幣個(gè)數(shù)。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

你可以認(rèn)為每種硬幣的數(shù)量是無限的。

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

示例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

Java解法

思路:

  • 這是一道經(jīng)典的動(dòng)態(tài)規(guī)劃題
    • 找出重疊子問題:n 總額的最小硬幣數(shù) +上 不同金額的硬幣 就是n+coins 總額的最小值
    • 找出最優(yōu)子結(jié)構(gòu):求N時(shí),注意可解集中篩去無法得出的 f(n-c)
    • 寫出狀態(tài)轉(zhuǎn)移方程:
      • f(n) ={
        • -1 n<0
        • 0 n=0
        • {min(f(n-c)+1)|c∈coins} n>0
      • }
package sj.shimmer.algorithm.m4_2021;

/**
 * Created by SJ on 2021/4/24.
 */

class D86 {
    public static void main(String[] args) {
//        System.out.println(coinChange(new int[]{10},8));
//        System.out.println(coinChange(new int[]{1,2,5},8));
//        System.out.println(coinChange(new int[]{1,2,5},3));
//        System.out.println(coinChange(new int[]{1,2,5},4));
        System.out.println(coinChange(new int[]{2},3));
        System.out.println(coinChange(new int[]{ 1,2,5}, 11));
    }

    /**
     *  f(n) ={
     *    -1 n<0
     *    0 n=0
     *    {min(f(n-c)+1)|c∈coins} n>0
     *  }
     * @param coins
     * @param amount
     * @return
     */
    public static int coinChange(int[] coins, int amount) {
        int len = amount + 1;
        int[] dp = new int[len];
        for (int i = 0; i < len; i++) {
            dp[i] = Integer.MAX_VALUE;
        }
        dp[0] = 0;
        for (int i = 0; i < len; i++) {
            for (int coin : coins) {
                if (i-coin<0||dp[i-coin]==Integer.MAX_VALUE) {
                    continue;
                }
                dp[i] = Math.min(dp[i],dp[i-coin]+1);
            }
        }
        return dp[amount]==Integer.MAX_VALUE?-1:dp[amount];
    }
}
image

官方解

https://leetcode-cn.com/problems/coin-change/solution/322-ling-qian-dui-huan-by-leetcode-solution/

  1. 記憶化搜索

    數(shù)學(xué)大佬的世界。。。

  2. 動(dòng)態(tài)規(guī)劃

    類似我的解法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 322. 零錢兌換 給定不同面額的硬幣 coins 和一個(gè)總金額 amount。編寫一個(gè)函數(shù)來計(jì)算可以湊成總金額所...
    傅晨明閱讀 280評(píng)論 0 0
  • 部分參考labuladong 閱讀筆記 動(dòng)態(tài)規(guī)劃 適用范圍: 一般是為了求最值。 最值,一般都需要窮舉來找到最合適...
    錦繡拾年閱讀 1,152評(píng)論 0 0
  • 最近在LeetCode上刷算法題,準(zhǔn)備秋招。刷了一些題之后,發(fā)現(xiàn)有些題非常棒,能夠?qū)⒍喾N知識(shí)點(diǎn)結(jié)合在一起。本文就以...
    鄧文達(dá)閱讀 2,368評(píng)論 0 0
  • https://leetcode-cn.com/problems/coin-change/首先常見的貪心算法不合適...
    gykimo閱讀 480評(píng)論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,834評(píng)論 28 54

友情鏈接更多精彩內(nèi)容