Я делаю игру, состоящую из монетных достоинств в $10, $5, $3 и $1. У игрока может быть 0 или более каждого типа валюты в его инвентаре с максимальным количеством 15 монет. Я пытаюсь понять, как правильно выбрать монеты, чтобы в результате было дано меньшее количество изменений. Сначала я подумал, что это будет легко решить, но теперь у меня проблемы с обволакиванием вокруг него.
Вот два примера, которые объясняют ситуацию далее:
Пример 1:
Пользователь несет эти монеты: $5, $3, $3, $3, $1, $1, $1, $1 и хочет купить товар за $12. Решение было бы заплатить $5, $3, $3, $1 и не давать никаких изменений.
Пример 2:
Пользователь не имеет никаких монет на сумму 1 доллар США и нести $5, $3, $3, $3, $3. Товар куплен за 12 долларов, поэтому они платят с 5, 3, 3 и 3 долларами, и возвращается 2 доллара.
Так как мы сначала выбираем крупные монеты, то я не могу понять, как узнать, есть ли в инвентаре достаточно низкоценных монет (в этом случае 1 доллар США), чтобы разместить пример 1, а если нет достаточно, чтобы использовать более высокоценные монеты, как в примере 2.
Дальнейшая проблема приведена в следующем примере, хотя я был бы рад, если бы вы использовали следующие два примера:
Пример 3: Пользователь несет эти монеты: $5, $3, $3, $3. Игрок покупает что-то за 6 долларов. Лучше использовать $3 и $3 и не возвращать никаких изменений, а не использовать $5 и $3 и давать $2 в изменении.
Я считаю, что первые два примера могут быть решены с помощью рекурсии и вариации жадного алгоритма.
Награда за награду:
Я добавил свой собственный ответ ниже как временное решение. Однако мне нравится подход г-на Лламы ниже (см. Ссылку, на которую он ссылается), и хотел бы найти пример PHP, чтобы удовлетворить это. Я считаю, что этот подход не требует рекурсии и использует memoization.
Если есть несколько вариантов для наименьшего количества изменений, я хотел бы, чтобы связь была привязана к той, которая платит с наименьшим количеством монет.