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/

你可能感兴趣的:(LeetCode,动态规划,找零钱,322,coin-chang)