Not the fastest, but rather simple recursive algorithm (C # code). You need to start with something?
static int GetSum(int value, int[] nominals) { if (value <= 0) return 0; int res = nominals[0] + GetSum(value - nominals[0], nominals); for (int i = 1; i < nominals.Length; ++i) { int candidat = nominals[i] + GetSum(value - nominals[i], nominals); if (res > candidat) res = candidat; } return res; }
Test:
int[] nominals = { 30, 70, 90, 100 }; Console.WriteLine(GetSum(45, nominals)); // 60 Console.WriteLine(GetSum(60, nominals)); // 60 Console.WriteLine(GetSum(155, nominals)); // 160 Console.WriteLine(GetSum(150, nominals)); // 150
If you add a memo:
static Dictionary<int, int> mem = new Dictionary<int, int>(); static int GetSum(int value, int[] nominals) { if (value <= 0) return 0; if (mem.TryGetValue(value, out var res)) return res; res = nominals[0] + GetSum(value - nominals[0], nominals); for (int i = 1; i < nominals.Length; ++i) { int candidat = nominals[i] + GetSum(value - nominals[i], nominals); if (res > candidat) res = candidat; } return mem[value] = res; }
then it takes such numbers as input:
Console.WriteLine(GetSum(54321, nominals)); // 54330