![]() |
![]() |
klem4 |
![]()
Сообщение
#1
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Необходимо разбить массив на N (2 в моем случае) равных по сумме массива. Есть 2 решения:
1 - перебором -- оптимально по результату, не оптимально по этическим соображениям 2 - следующий алгоритм: 1. сортируем начальный массив по убыванию. 1.1 A = [], B = []; 2. пока в начальном массиве есть элементы 2.1 ищем массив с мин. суммой из (A и B), кладем в него 0-й элемент из начального массива, удаляем его из начального массива. 2.2 goto 2 во втором варианте на начальном массиве [24,24,20,20,20], получаем A = [24,20], B = [24,20,20], неплохо, но не оптимально, оптимально будет A = [24,24], B = [20,20,20] Есть предложения ? -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
![]() ![]() |
Lapp |
![]()
Сообщение
#2
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Необходимо разбить массив на N (2 в моем случае) равных по сумме массива. Как я понял, все же не равных, просто нужно минимизировать разницу. Да?При N=2 - это чистейшая задача о рюкзаке (считаем полную сумму, делим на 2 и принимаем это за емкость рюка). При бОльших N, на самом деле, тоже, но поэтапно (делим сумму на N, набиваем первый рюк, остаток суммируем и делим на N-1 и т.д.) Конечно, перебор решает ее точно. Но похоже на то (судя по комментам), что тебя устроит некое "оптимальное" решение. Но тогда ты оговори условия этой оптимальности.. ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
![]() ![]() |
![]() |
Текстовая версия | 8.07.2025 23:37 |