Coin Change 2
Description
You are given coins of different denominations and a total amount of money. Write a function to compute the number of combinations that make up that amount. You may assume that you have infinite number of each kind of coin.
Example 1:
Input: amount = 5, coins = [1, 2, 5] Output: 4 Explanation: there are four ways to make up the amount: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1
Example 2:
Input: amount = 3, coins = [2] Output: 0 Explanation: the amount of 3 cannot be made up just with coins of 2.
Example 3:
Input: amount = 10, coins = [10] Output: 1
Note:
You can assume that
- 0 <= amount <= 5000
- 1 <= coin <= 5000
- the number of coins is less than 500
- the answer is guaranteed to fit into signed 32-bit integer
Solution(javascript)
// // Recursive with memo
// const change = (n, coins) => {
// const arr = coins
// const memo = {}
// const aux = (index = 0, amount = 0) => {
// memo[index] = memo[index] || {}
// if (memo[index][amount] !== undefined) {
// return memo[index][amount]
// }
// if (amount === n) {
// return 1
// }
// if (amount > n || index >= arr.length) {
// return 0
// }
// memo[index][amount] = aux(index, amount + arr[index]) + aux(index + 1, amount)
// return memo[index][amount]
// }
// return aux()
// }
// 2: Bottom-up
const change = (n, coins) => {
if (!coins.length) {
return n === 0
}
const arr = coins
let memo = []
for (let i = arr.length - 1; i >= 0; i--) {
const current = []
for (let amount = n; amount >= 0; amount--) {
if (amount === n) {
current[amount] = 1
} else {
current[amount] = (current[amount + arr[i]] || 0) + (memo[amount] || 0)
}
}
memo = current
}
return memo[0]
}