Другое название алгоритма: Алгоритм оптимального распределения камней по ящикам.
Я переписал найденный в книге алгоритм с сохранением названий переменных.
function SIM($U, $size)
{
$J = 0;
$Q = $size;
$U_J = array(array());
rsort($U);
while (count($U))
{
$u_k = array_shift($U);
while ($u_k < $Q / 2)
$Q /= 2;
$u_i = 0;
foreach ($U as $key => $value) {
if ($u_k + $value <= $Q) {
$u_i = $value;
unset($U[$key]);
break;
}
}
if ($u_k + $u_i + array_sum($U_J[$J]) > $size)
$J++;
$U_J[$J][] = $u_k;
if ($u_i)
$U_J[$J][] = $u_i;
}
return $U_J;
}
Функция принимает массив размеров сортируемых предметов первым параметром и размер контейнера вторым.
Возвращает многомерный массив контейнеров, содержащих в себе размеры предметов.
Проверок входных данных нет.
Пример вызова:
$arr = SIM(array(0.1, 0.3, 0.5, 0.2, 1, 0.9), 1);
У меня эта функция нашла применение при записи огромного количества фильмов на DVD болванки.
Спустя 1 год, 11 месяцев, 12 дней, 12 часов, 26 минут, 37 секунд (29.08.2012 - 13:28) Fred написал(а):
Никак не пойму, как переделать под контейнеры разной вместимости(