0

Например:

$groups = [
    ['name' => 'Group 1', 'items' => [1]],
    ['name' => 'Group 2', 'items' => [1,2]],
    ['name' => 'Group 3', 'items' => [1,2,3,4,5,6]],
    ['name' => 'Group 4', 'items' => [1,2,3]],
    ['name' => 'Group 5', 'items' => [5,6]],
    ['name' => 'Group 6', 'items' => [5]],
];

Должен разделиться на массивы содержащие примерно одинаковое число элементов. Если пополам, то:

[
        [
            ['name' => 'Group 1', 'items' => [1]],
            ['name' => 'Group 2', 'items' => [1,2]],
            ['name' => 'Group 4', 'items' => [1,2,3]],
            ['name' => 'Group 5', 'items' => [5,6]],
        ],
        [
            ['name' => 'Group 3', 'items' => [1,2,3,4,5,6]],
            ['name' => 'Group 6', 'items' => [5]],
        ] 
];

Это удобно, когда выводишь списки в колонки (например, меню), и надо, чтобы не образовывались пустые области.

  • http://ru.stackoverflow.com/questions/581668/%D0%9A%D0%BE%D0%B4-%D0%B3%D0%BE%D0%BB%D1%8C%D1%84-%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0-%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B8-%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D0%B9/583446#583446 Если кратко, то число элементов - это вес массива. Вам надо найти комбинацию, которая в сумме даст половину общего веса. (ну или +-1, если общий вес нечетный) – rjhdby Dec 09 '16 at 11:46
  • Если пополам, то - что-то фиговенький пополам получился, в первой группе 8 элементов, а во второй 6... – Akina Dec 09 '16 at 12:22
  • @Akina во второй 7. – ForgottenPark Dec 09 '16 at 14:24
  • Ну тады ладноть... – Akina Dec 09 '16 at 14:49

1 Answers1

2

Классическая задача о рюкзаке.

Поскольку предметная область не требует непременно оптимальное решение, можно попробовать жадный алгоритм. Т.е. вектор количества элементов в массиве сортируем по убыванию и начинаем раскладывать в два (или больше - смотря на сколько частей нужно поделить) вектора, кладя очередной элемент в тот вектор, где на текущий момент сумма меньше.

Akina
  • 31,807