Problem:
Coin Changing Problem

Find the minimum number of coins to make change for n cents using coins of denominations d1, d2,.., dm. The coins can be used any number of times.

Input

n m
d1 d2 ... dm

Two integers n and m are given in the first line. The available denominations are given in the second line.

Output

Print the minimum number of coins in a line.

Constraints

1 ≤ n ≤ 50000

1 ≤ m ≤ 20

1 ≤ denomination ≤ 10000

The denominations are all different and contain 1.

Sample Input 1

55 4
1 5 10 50

Sample Output 1

2

Sample Input 2

15 6
1 2 7 8 12 50

Sample Output 2

2

Sample Input 3

65 6
1 2 7 8 12 50

Sample Output 3

3

Solution in JavaScript (judge verdict: Runtime Error)

const input = require('fs').readFileSync('/dev/stdin', 'utf8');

const list = input.trim().split('\n');
let [ n, m ] = list[0].split(' ');
n = Number(n);
m = Number(m);
let cm = list[1].trim().split(' ');
cm = cm.map(c => Number(c));

const dp = new Map();
dp.set(n, 0);
const memo = (count, yen) => {
  let nextCount;
  let nextYen = yen - 1;
  let result;
  if (!dp.has(yen)) {
    nextCount = count;
  } else {
    const min = Math.min(dp.get(yen), count);
    dp.set(yen, min);
    if (yen === 0) {
      result = dp.get(yen);
    } else {
      nextMin = min + 1;
      for (let i = 0; i < m; i++) {
        const afterYen = yen - cm[i];
        if (afterYen < 0) {
          continue;
        } else if (dp.has(afterYen)) {
          dp.set(afterYen, Math.min(dp.get(afterYen), nextMin));
        } else {
          dp.set(afterYen, nextMin);
        }
      }  
    }
  }

  return result || memo(nextMin, nextYen);
}

console.log(memo(1, n));