Given a list of coins[] representing different denominations, count all combinations of the coins to make a given value sum.
This algorithm uses memoization to improve performance. It's same as the recursive version of Find number of way to make coin change, but with a special 'cache' to store results. The 'cache key' is crucial. It's how we identify and store past results. Sometimes we need one key, sometimes multiple keys. We add code to:
cache = None
def count(coins, total):
if (total < 0 or len(coins) <= 0):
return 0
if total == 0:
return 1
global cache
if not cache:
cache = [[None for _ in range(total + 1)] for _ in range(len(coins) + 1)]
if not cache[len(coins)][total]:
cache[len(coins)][total] = count(coins, total - coins[0]) + count(coins[1:], total)
return cache[len(coins)][total]
coins = [1, 2, 3]
total = 4
print(count(coins, total))
let cache = null;
function count(coins, sum) {
if (sum < 0 || coins.length <= 0) {
return 0;
}
if (sum === 0) {
return 1;
}
if (cache === null) {
cache = [];
for (let i = 0; i < coins.length + 1; i++) {
cache[i] = [];
}
}
if (cache[coins.length][sum] === undefined) {
cache[coins.length][sum] = count(coins, sum - coins[0]) + count(coins.slice(1), sum);
}
return cache[coins.length][sum];
}
const coins = [1, 2, 3];
const sum = 4;
console.log(count(coins, sum));