Если все, что вам нужно, - это грубое решение, то будет работать что-то простое:
Solve(amount, denoms[1...m], partial[1...n], pos, sum)
1. if sum = amount then print partial[1...n], pos - 1
2. if pos <= n then
3. for i = 1 to m do
4. partial[pos] = denoms[i]
5. Solve(amount, denoms[1...m], partial[1...n], pos + 1, sum + denoms[i])
6. partial[pos] = 0
Способ использовать это - сделать звонок Solve(amount, denoms[1...m], partial[1...n], 1, 0)
. Это напечатает все решения вместе с длиной каждого решения, с которым встречаются. Обратите внимание, что при этом будут распечатаны все перестановки каждого решения, поэтому он выполняет изрядное количество ненужной работы; кроме того, он продолжает рекурсию даже после превышения суммы. Обе эти проблемы могут быть исправлены с помощью нескольких дополнительных строк кода. Выполняйте рекурсивный вызов, например, только если текущая сумма меньше или равна сумме, и отслеживайте наименьшее использованное на данный момент наименование и используйте только обозначения. такого размера или меньше - но эти улучшения производительности не изменят производительность метода асимптотически значимым образом (то есть, они не делают алгоритм полиномиальным по времени). Действительно, эта проблема, вероятно, может быть довольно легко сведена к NP-полной задаче, и поэтому она, вероятно, не имеет доступного решения за полиномиальное время.