РЕДАКТИРОВАТЬ
Это конкретный пример проблемы комбинации / подмножества, ответ здесь.
Поиск всех возможных комбинаций чисел для достижения заданной суммы
--- Я сохраняю свой ответ ниже (поскольку он был кому-то полезен), однако, по общему признанию, это не прямой ответ на этот вопрос ---
ОРИГИНАЛЬНЫЙ ОТВЕТ
Наиболее распространенным решением является динамическое программирование:
Сначала вы найдете самый простой способ внести изменение в 1, затем вы используете это решение, чтобы внести изменения в течение 2, 3, 4, 5, 6 и т. Д. .... На каждой итерации вы «проверяете», можно перейти «назад» и уменьшить количество монет в вашем ответе. Например, до «4» необходимо добавить копейки. Но как только вы доберетесь до «5», вы можете удалить все пенни, и для вашего решения требуется только одна монета: никель. Но затем, до 9, вы снова должны добавить копейки, и т. Д. И т. Д.
Однако методология динамического программирования не гарантируется как быстрая.
Кроме того, вы можете использовать жадный метод, при котором вы постоянно выбираете как можно большую монету. Это очень быстро, но не всегда дает вам оптимальное решение. Однако, если ваши монеты 1 5 10 и 25, Greedy работает отлично и намного быстрее, чем метод линейного программирования.