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

說明:
你可以認為每種硬幣的數量是無限的。

題目分析

   很顯然,這是一道動態規划問題。和第279完全平方數的解法如出一轍。

  我們求11的硬幣數,相當於求n=10,n=9,n=6的銀幣數中的最小值+1.

  道理明白以后,這里我們倒着填並不是明智的。因為n=10,n=9,n=6的數據都是空的,同樣前面的數也都是空的。

  所以我們采取自下而上的填充測略,可以減省空間的消耗

  

Java題解

class Solution {
    public int coinChange(int[] coins, int amount) {
        if(amount==0||coins.length<=0)
            return 0;
        int[] dp = new int[amount+1];
        Arrays.fill(dp,amount+1);
        Arrays.sort(coins);
        for(int i=1;i<=amount;i++)
        {
            for(int j=0;j<coins.length;j++)
            {
                if(i-coins[j]==0)
                    dp[i]=1;
                else if(i-coins[j]>0){
                    dp[i]=Math.min(dp[i],dp[i-coins[j]]+1);
                }
            }
        }
        return dp[amount] > amount ? -1 : dp[amount];
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM