LINUX.ORG.RU

Разложить k элементов по n массивов так чтобы сумма элементов в каждом массиве стремилась к m

 , ,


0

1

Сабж.

Есть k целых в случайном порядке. Есть некоторое значение m. Необходимо разбить эти k элементов на группы, так, чтобы сумма в каждой группе была меньше m и как можно ближе к нему. Как?

Пример, если я плохо сформулировал: 47,12,44,55,123,30

при m равном 200 нужно получить что-то вроде:
47,123,30 (S=200)
12,55,88,44 (S=199)

Порядок не важен.

★★★★★

Последнее исправление: Suntechnic (всего исправлений: 1)

это NP-полня задача, так что.... Brunch&Bound, тупой перебор, Лагранжева релаксация и т.п.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

:'(

Точно? Как-то это больно на PHP для веба. То, что у меня все значения в приблизительно заранее известном диапазоне, мне никак не поможет?

Suntechnic ★★★★★
() автор топика
Последнее исправление: Suntechnic (всего исправлений: 1)
Ответ на: комментарий от Suntechnic

Точно?

точно. Если не веришь мне, посмотри на вики.

Как-то это больно на PHP для веба. То, что у меня все значения в приблизительно заранее известном диапазоне, мне никак не поможет?

В общем случае никак. Но если тебе не обязательно необходимо оптимальное решение, а достаточно близкого к оптимальному, то тогда все не так уж и плохо.

Это изветсная задача. Subset Sum Problem.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Спасибо. Пошел читать. Конечно же мне оптимального решения не надо. Надо «как нибудь». Дизайнер, сцуко придумал хитрую мозаику.

Suntechnic ★★★★★
() автор топика

стремилась к m

была меньше m и как можно ближе к нему

а поточнее? что значит «ближе к m» с учетом того, что этих сумм несколько? что лучше при m=200:

[ 101+98 , 102+97 ]
или
[ 102+98, 101+97 ]
MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

Из примера лучше первое. На самом деле при m'<m лучше вариант при котором (m-m')/n было бы минимальным (n - количество элементов отобранных для получения m'). Пусть это оценка будет P (т.е. P=(m-m')/n) тогда лучшее разбиение это где произведение всех P минимальна. Я так думаю.

http://joxi.ru/7-P_U_3JTJAENbT_rg0 - каждая строка это группа. Числа на оранжевых табах слева - это как раз P каждой группы. Последняя группа с P==3.75 выброшена как уже очень плохая, поэтому строк меньше чем табов.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

произведение всех P минимальна

в таком варианте, если одно из P = 0 равно нулю, получаем идеальное распределение независимо от остальных P

обычно минимизируется сумма квадратов, реже - сумма модулей

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

Не придирайся. Понимаешь же, что P+1. Ну а так, правильно, да - сумма квадратов. Сумма модулей выглядит не очень хорошим решением.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Я напротив говорил, что нужна, когда у меня спрашивали когда она тебе пригодилась в вебе последний раз. Но сейчас лень искать тему чтобы ответить.

Suntechnic ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.