leetcode_322 Coin Change


  • テーマ分析:小銭を交換し、最小の小銭数で、目標の数を交換します.
  • 問題を解く構想:
  • 動的計画解1)dp[i]は、目標iを交換するために必要な最低硬貨数を表す.2)計算中の動的計画式はdp[i+coins[j]=min(dp[i+coins[j],dp[i]+1)である.

  • インプリメンテーションプログラム
  • C++バージョン
    class Solution 
    {
        public:
        int coinChange(vector<int> &coins, int amount)
        {
            const int INF = 0x7ffffffe;
            //   dp,     
            vector<int> dp(amount + 1, INF);
            dp[0] = 0;       //         
            for (int i = 0; i <= amount; i++)
            {
                for (int j = 0; j < coins.size(); j++)
                {
                    //          
                    if (i + coins[j] <= amount && dp[i + coins[j]] > dp[i] + 1)
                        dp[i + coins[j]] = dp[i] + 1;
                }
            }
            return dp[amount] == INF ? -1 : dp[amount];
        }   
    }; 
    
  • Javaバージョン
        public int coinChange(int[] coins, int amount){
        int[] dp = new int[amount + 1];
        final int INF = 0x7ffffffe;
        //    dp[i]  ,   1     
        for (int i = 0; i <= amount; i++)
            dp[i] = INF;
        dp[0] = 1;
        //         
        for(int i = 0; i <= amount; i++){
            for (int j = 0; j < coins.length; j++){
                if (i + coins[j] <= amount)
                    dp[i + coins[j]] = Math.min(dp[i + coins[j]], dp[i] + 1);
            }
        }
        return dp[amount] == INF ? -1 : dp[amount]; 
    }
    
  • 参考文献https://www.hrwhisper.me/leetcode-coin-change/