Аноны, много лет у нас в задачнике висит задача про Банкомат (есть банкомат, в нем есть ограниченное количество купюр нескольких номиналов, как выдать сумму K?). Но все это время я сам не знал оптимального решения, и предлагал решать ее полным перебором. То есть, берем все возможные комбинации всех банкнот, пока не получим нужную сумму. Однако, если банкнот много, перебор будет очень долгим. Например, если у нас 1000 банкнот 4 видов, и надо выдать очень большую сумму, то придется перебирать 1000 x 1000 x 1000 x 1000 = 10004 = 1 триллион комбинаций. Даже на современном компьютере это долго. Как же тогда банкоматы справляются с проблемой? Я даже думал, не поменять ли условия задачи, а то, может быть, я даю нерешаемую задачу людям. А в интернете находятся задачи про банкомат с неограниченным количеством купюр. Однако сегодня, я прочел, что такая задача сводится к задаче о рюкзаке и решаема за более быстрое время за счет динамического программирования.Кажется, я нашел способ решить задачу быстрее. Например, в примере выше нам потребуется лишь 40002 = 16 миллионов шагов.
>>2006071Если купюры конкретные, естественных номиналов, то задача конечно простая. Это когда тебе надо работать с заранее неизвестными купюрами, например в 16, 17, 983 и 3751 рубль (заранее неизвестными), вот тогда уже сложно становится.
>>2006096Я могу ошибаться, но простой "жадный" алгоритм работает только при таких наборах купюр, когда любую большую купюру можно заменить целым числом более мелких. Например, 1000, 500, 100: 1000 = 2x500, 500 = 5x100, потому алгоритм работает.Если же взять купюры 500, 200 и 100 то 500 нельзя набрать купюрами по 200 и алгоритм не сработает.
>>2006096Вот пример, где "жадный" алгоритм не работает.Есть купюры: 5x500, 3x200, 0x100. Надо выдать 600. Тут "жадный" алгоритм возьмет 1 купюру по 500, останется 100 в остатке, но их он выдать не сможет.
>>2006110Всё верно, но всё равно алгоритм элементарно "хардкодится". Тебе надо только отдельно рассматривать случаи набора некоторых сумм.Для варианта в 100, 200 и 500 рублей вполне подойдёт обычная жадная схема500 = 500600 = 500+100 (проще, чем 200+200+200)700 = 500+200Если бы была схема, где купюры 50, 300, 500 рублей, то чуть хитрее было бы, скажем 600 = 300+300, что лучше, чем 500+50+50Но обычно можно придумать решение частное, прописав некоторые исключения.Когда рандомные номиналы, вот тогда уже надо ДП подключать.
>>2006112А, понял о чём ты.К слову не уверен, что реальные банкоматы такую задачу умеют решать, скорее они могут тупо заменить большой номинал на мелкие. Скорее всего реальный банкомат просто скажет, что выдать сумму не может. Хотя на самом деле может.В любом случае под конкретные купюры задача сильно упрощается, даже с перебором, перебор будет проще.
>>2006122Нет, жадный алгоритм тут не сработает. Посмотри внимательно на ситуацию в >>2006112 . Там нет 100-рублевых купюр и жадный алгоритм не сможет выдать 600 рублей.>>2006130Грабитель пытается взять как можно больше (но не более K). Мы можем запустить алгоритм грабителя, а в конце просто посмотреть, сколько он набрал. Если это число меньше, чем требуемая сумма K, то выдать ее невозможно (иначе бы грабитель смог её собрать). Если набранное количество золота равно требуемой сумме K, то возможно.>>2006120Никакое количество проклятий не заставит stristr работать с utf-8. Надо переписывать на использование mb-функций.
>>2006180Я сижу в других тредах, где к программированию на PHP принято относиться поплёвывая свысока.Посмотрел, что за задачка здесь обсуждается. Там конкретные купюры:есть банкомат, в нём фиксированный набор купюр в 100, 500, 1000, 5000 рублей. Нужно проверить, можно ли выдать нужную сумму, и если можно, то выдать её наименьшим количеством купюр.Это, всё-таки, другая задача, чем задача о сборке рюкзака. И в данном частном случае сильно более простая, потому что любую купюру старшего номинала можно выдать купюрами меньших номиналов. Нет даже истории о купюрах в 200 и 500 рублей. Тут ДП даже и не нужно.Задача о рюкзаке намного сложнее.
>>2006219> где к программированию на PHP принято относиться поплёвывая свысокаванильный жс хуже если тебя утешит