Frustrated? Yes. Why? Because it is impossible for me to be God.
Привет. Подскажите, как решать классические задачи на поиск всевозможных комбинаций?
Пример: известен вес определенного кол-ва людей (каждого отдельно) и известна грузоподъемность лифта. Найти группу из максимального кол-ва людей, которых можно за раз перевезти на лифте.
Как такое реализовать? В идеале - на Python. Сама вообще без идей.(
Пример: известен вес определенного кол-ва людей (каждого отдельно) и известна грузоподъемность лифта. Найти группу из максимального кол-ва людей, которых можно за раз перевезти на лифте.
Как такое реализовать? В идеале - на Python. Сама вообще без идей.(
На всякий случай добавлю, что сортировать надо по возрастанию и начинать с человека с минимальным весом
Просто любопытно, а как это решаемо без сортировки?
Кстати, наверное, ты прав. Вроде как критерий "каждый раз выбираем локальное оптимальное решение" проходит.
Я, грешным делом, сперва начал думать про динамическое программирование, составил несколько формул и уже потом понял, что ничего этого не нужно)
Просто любопытно, а как это решаемо без сортировки?
Вам на каждом шаге (выборе человека) необходимо выбирать по минимальному весу. Т.е. на каждом шаге в массиве весов нужно находить минимум. Можно и не сортировать тогда.
а чем сортировка не угодила? Быстрая и выбор имеют сложность n * ln n, а если каждый раз искать минимум, то это всего лишь извращение на тему сортировки выбором
И у Вас не совсем задача о рюкзаке, это ее более легкий подвид, который решается при помощи алгоритма, имеющего полиномиальную сложность. Так что не надо из пушки по воробьям
Но по-прежнему интересует, как найти всевозможные комбинации. Это вроде экспоненциальная сложность уже будет?
да, эскпоненциальная, только полный перебор вариантов, организовать можно разными способами.
поподбробнее уже от конкретной задачи зависит
Всевозможные комбинации из той же группы людей, например.
Полный перебор подразумевает, что вы составите все возможные выборки из доступных людей, а потом каждую проверить на "увозимость" лифтом (т.е. общая масса этой выборки должна быть меньше максимально массы лифта).
Вероятно, есть более быстрые решения. Но это уже надо придумывать.
Всевозможные комбинации из той же группы людей, например.
Если нужны все возможные комбинации, то тогда полный перебор. Например, берете одного человека. Это одна комбинация. Потом составляете пары его и всех остальных. Потом для каждой пары подбираете третьего и т.д. Когда закончите с первым человеком, делайте все то же самое, но только совсем не учитывайте первого (иначе будут повторяющиеся комбинации). Здесь удобно использовать рекурсию и парадигму функционального программирования (питон ее вроде как поддерживает).
Хотя я все равно не понимаю, зачем организовывать полный перебор вариантов. Это крайне неэффективно и практически никогда не нужно в реальности, практически всегда достаточно какого-либо приближенного алгоритма (про жадные уже сказали).
А программа с полным перебором нужна для универа, мол, и такое, если что, мы тоже должны уметь.)))
пожалуйста.
Раз для универа и язык Питон, то это наверняка именно на функциональное программирование. Его принципы частично даже противоречат императивному (все приведенные выше способы относились к императивному). Я функциональным не занимаюсь, только немного знаю логическое, язык ПРОЛОГ-Д. В нем не нужно реализовывать полный перебор, это система делает сама. В Питоне, по идее, то же самое, но как именно это работает, я сказать не могу. Читайте книжки, в общем