@ddd329

Как разместить N файлов по папкам?

Каким алгоритмом можно решить следующую задачу: дано N файлов, каждый из которых имеет свой размер. Необходимо разместить файлы в папках так, чтобы размер файлов в каждой папке не превышал 2 мегабайта, и чтобы количество папок было как можно меньше?
  • Вопрос задан
  • 244 просмотра
Решения вопроса 2
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Это задача об упаковке. Она сложная. И ближе даже не к задаче о рюкзаке, а к задаче о мульти-рюкзаке. Для больших размеров файлов и N решения, кроме переборного, нет.

Если N маленькое, то есть быстрые алгоритмы вроде Динамического Программирования. Но там и перебор будет не то, чтобы сильно медленнее.

Если вам не важно получить абсолютно минимально возможное количество папок, то подойдет какое-нибудь жадное решение. Оно даст хорошее приближение. Скажем, вместо 30 идеальных папок вы часто получите 40.

Например, кладите файлы в текущую папку, пока они туда помещаются. Потом создавайте следующую папку. Заполняйте ее, пока размер папки + размер следующего файла <= 2Mb.

Можно всякие эвристики сюда навешивать: например, отсортиовали файлы по размеру. Жадно пихаем самые большие файлы, пока помещается. Потом жадно пихаем самые маленькие. Потом начинаем новую папку.
Ответ написан
Комментировать
AshBlade
@AshBlade
Просто хочу быть счастливым
1. Сортируешь все файлы по размеру
2. Берешь самый большой файл и помещаешь в первую папку
3. Дальше каждый файл по убыванию размера:
1. Находишь папку с наименьшим оставшимся размером, который позволяет добавить туда файл
2. Если таких нет - создаешь новую папку и кладешь туда
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mindtester
@mindtester
http://iczin.su/hexagram_48
вам сюда

ps ок. на математику не учились. бывает. остается выбор декларативного (или функционального языка)... (мой любимый шарп уже практически оброс функциональщиной...)...
... и тупой перебор вариантов... а он может оказаться долгим... но это правда жизни
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы