From 1ababd77765b8752c565058c24968ebcc34af819 Mon Sep 17 00:00:00 2001 From: LouisFonda Date: Tue, 24 Jun 2025 01:31:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92322?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dynamic-planning/332零钱兑换.js | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 top-interview-leetcode150/dynamic-planning/332零钱兑换.js diff --git a/top-interview-leetcode150/dynamic-planning/332零钱兑换.js b/top-interview-leetcode150/dynamic-planning/332零钱兑换.js new file mode 100644 index 0000000..b2d6ac6 --- /dev/null +++ b/top-interview-leetcode150/dynamic-planning/332零钱兑换.js @@ -0,0 +1,51 @@ +/** + * @param {number[]} coins + * @param {number} amount + * @return {number} + */ +const coinChange = function (coins, amount) { + +}; + +/* +这个问题可以抽象成一个完全背包问题,物品的价值就是硬币的面值,物品的重量也是硬币的面值,定义dp[i][j]表示0-i类型的硬币 +中,组合成j所需硬币的数量 +*/ +function f1(coins, amount) { + const m = coins.length; + const n = amount; + const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(Infinity)); + + // 初始化:金额为0,硬币数为0 + for (let i = 0; i <= m; i++) { + dp[i][0] = 0; + } + + for (let i = 1; i <= m; i++) { + const coin = coins[i - 1]; + for (let j = 1; j <= n; j++) { + if (j < coin) { + dp[i][j] = dp[i - 1][j]; // 当前硬币无法选,用上一行的结果 + } else { + // 可以选当前硬币(完全背包,不是 i-1) + dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - coin] + 1); + } + } + } + + return dp[m][n] === Infinity ? -1 : dp[m][n]; +} + +// 上面的代码可以使用一维dp来实现,dp[i]表示找i元需要最少的硬币 +function coinChange(coins, amount) { + const dp = Array(amount + 1).fill(Infinity); + dp[0] = 0; // 金额为 0 时需要 0 个硬币 + + for (let coin of coins) { + for (let j = coin; j <= amount; j++) { + dp[j] = Math.min(dp[j], dp[j - coin] + 1); + } + } + + return dp[amount] === Infinity ? -1 : dp[amount]; +} \ No newline at end of file