leetcode_322 Coin Change

本文介绍了一种解决零钱兑换问题的动态规划算法,旨在使用最少数量的硬币组合来达到特定的目标金额。通过C++和Java两种语言实现,详细展示了如何初始化状态数组并逐步更新状态以找到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 题目分析:

    零钱对换,用最少的零钱数,换取目标的数量。

  • 解题思路:

    • 动态规划求解

      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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值