leetcode硬幣組合問題

題目以下數組

 

     示例 1:

     輸入: amount = 5, coins = [1, 2, 5]
     輸出: 4
     解釋: 有四種方式能夠湊成總金額:
     5=5
     5=2+2+1
     5=2+1+1+1
     5=1+1+1+1+1
     示例 2:

     輸入: amount = 3, coins = [2]
     輸出: 0
     解釋: 只用面額2的硬幣不能湊成總金額3。
     示例 3:

     輸入: amount = 10, coins = [10]
     輸出: 1

複製代碼

解題思路以下: 採用動態規劃 已知硬幣面值coins[],用這些硬幣湊成指定的金額amount。要求硬幣個數最少。 設金額amount對應的最少硬幣個數爲:f(amount) 自上而下推,咱們能夠這樣想,金額amount對應的最少硬幣數f(amount),確定是由另外一個金額加上一個已有的硬幣面值來的。 能夠得出: f(amount) = min(f(amount-coins[0]),f(amount-coins[1])…)+1 代碼markdown

解題思路是從上向下,可是按照這個思路寫代碼時,會比較麻煩。能夠考慮自下而上的方式。
     初始化數組dp[amount+1],下標表示金額,值爲最少硬幣數。
     dp[coins[0]]=dp[coins[i]]=…=1
     由初始化後的數組,可推出以後全部的金額的最少硬幣數。
複製代碼
public static void main(String[] args) {
        //採用動態規劃
        /**
         * 已知硬幣面值coins[],用這些硬幣湊成指定的金額amount。要求硬幣個數最少。
         設金額amount對應的最少硬幣個數爲:f(amount)
         自上而下推,咱們能夠這樣想,金額amount對應的最少硬幣數f(amount),確定是由另外一個金額加上一個已有的硬幣面值來的。
         能夠得出:
         f(amount) = min(f(amount-coins[0]),f(amount-coins[1])…)+1
         代碼

         解題思路是從上向下,可是按照這個思路寫代碼時,會比較麻煩。能夠考慮自下而上的方式。
         初始化數組dp[amount+1],下標表示金額,值爲最少硬幣數。
         dp[coins[0]]=dp[coins[i]]=…=1
         由初始化後的數組,可推出以後全部的金額的最少硬幣數。
         dp[i+coins[n]] = dp[i+coins[n]]>dp[i]+1?dp[i]+1:dp[i+coins[n]];
         */
        int amount = 6;
        int coins[] ={1,2,5};
        //1*6 1*4+2 1*2+2*25*1
        int                result =new Solution().change(amount,coins);
        System.out.println(result);
    }
    static class Solution{
        public int change(int amount, int[] coins) {
           int dp[] = new int[amount+1];
            // 設置起始狀態
            dp[0] = 1;

            for (int coin : coins) {
                // 記錄每添加一種面額的零錢,總金額j的變化
                for (int j = 1; j <= amount; j++) {
                    if (j >= coin) {
                        // 在上一鍾零錢狀態的基礎上增大
                        // 例如對於總額5,當只有面額爲1的零錢時,只有一種可能 5x1
                        // 當加了面額爲2的零錢時,除了原來的那一種可能外
                        // 還加上了組合了兩塊錢的狀況,而總額爲5是在總額爲3的基礎上加上兩塊錢來的
                        // 因此就加上此時總額爲3的全部組合狀況
                        dp[j] = dp[j] + dp[j - coin];
                    }
                }
                  return dp[amount];
        }
    }
複製代碼
相關文章
相關標籤/搜索