// DP
var coinChange = function (coins, amount) {
let dp = Array(amount + 1).fill(Infinity);
dp[0] = 0;
for (let i = 1; i < dp.length; i++) {
for (let coin of coins) {
if (i - coin >= 0) dp[i] = Math.min(dp[i], dp[i - coin] + 1);
}
}
console.log(dp[dp.length - 1]);
return dp[dp.length - 1] === Infinity ? -1 : dp[dp.length - 1];
};
// μλλ κ·μΉμ μ°ΎκΈ° μν΄ λͺ κ°μ§ μ μ΄λ κ²μ΄λ€.
// F(11) -> F(9) / F(8) / F(6)
// -> λ§μ½ λ¬Έμ μμμ²λΌ 11μ λ§λ€μ΄μΌ νλ€λ©΄
// 9λ₯Ό λ§λλ κ²½μ°μ μ, 8μ λ§λλ κ²½μ°μ μ, 6μ λ§λλ κ²½μ°μ μ(μ¦, 3κ°μ§ κ²½μ°μ μ μ€μμ κ°μ₯ μμ κ°μ ꡬνλ©΄ λλ€.)μ μ΅μκ°μ ꡬνκ³ , κ±°κΈ°μ '1μ λνλ©΄' cost λ°°μ΄μ μ΄μ©ν΄ 11μ λ§λλ κ²½μ°μ μκ° λλ€.
// λ°λΌμ μ΄λ₯Ό μμΌλ‘ νννλ©΄
// F(11) = Math.min(F(9), F(8), F(6)) + 1
// μ’ λ μμΈν νννλ©΄
//F(n) = Math.min(F(n - cost[i]), F(n - cost[i + 1]), F(n - cost[i + 2])) + 1
// -> μμ μ½λλ μ§κΈκΉμ§ μμ±νλ μμ μ½λλ‘ ννν κ²μ
λλ€.
let coins = [1, 2, 5];
let amount = 11;
coinChange(coins, amount);
λ§μ°¬κ°μ§λ‘ DPλ₯Ό νμ©ν λ¬Έμ μλ€. μλ μ λͺ ν λ¬Έμ λΌ λ³΄μλ§μ Greedyλ‘ νμ΄μΌ νλ μ€ μκ³ DPλ₯Ό μκ°νμ§ λͺ»νμλλ°, κ·μΉμ μ°Ύκ³ λλ DPλ‘ ν΄κ²°νλ λ¬Έμ λΌλ κ²μ μκ² λλ€. μμΈ νμ΄ μ€λͺ μ μμ μ£ΌμμΌλ‘ λ체νκ² λ€.
μμ , μ§μ μ νμν©λλ€!
https://leetcode.com/problems/coin-change/