题目分析:
零钱对换,用最少的零钱数,换取目标的数量。
解题思路:
动态规划求解
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]; }
参考文献
leetcode_322 Coin Change
最新推荐文章于 2025-05-12 19:07:38 发布