Доброго времени суток. Есть массив: PHP: <?php // ALL USER $teams = [ 0 => ['rait' => 12], 1 => ['rait' => 5], 2 => ['rait' => 10], 3 => ['rait' => 10] ]; ?> Пытаюсь заполнить два массива( 2 команды, красная и синяя ) равномерно по значению (рейтинг) "rait" PHP: <?php shuffle($teams); usort($teams, function($x, $y) { return mt_rand(1,2) == 1 ? ( $x["rait"] > $y["rait"] ? 1 : ($x["rait"] < $y["rait"] ? -1 : 0) ) : ( $x["rait"] > $y["rait"] ? 1 : ($x["rait"] < $y["rait"] ? -1 : 0) ); }); $c_1 = []; $c_2 = []; for ( $i = 0; $i < sizeOf($teams); $i++) { if ( $i%2==0 ) $c_1[] = $teams[$i]['rait']; else $c_2[] = $teams[$i]['rait']; } /* var_dump() array ( 0 => 5, 1 => 10, ) array ( 0 => 10, 1 => 12, ) */ ?> Выходит, что первая команда априори более слабая, чем вторая. 1) 5 + 10 ( общий 15 ) 2) 10 + 12 ( общий 22 ) Подскажите, пожалуйста, как реализовать систему распределения так, чтобы (по данному примеру) вышло 12 + 5 в первой команде и 10 + 10 во второй
Ну, перебрать все возможные сочитания игроков в командах, запомнить общие очки команд и выбрать с минимальной разницей, ничего больше не придумал.
Кроме перебора: разве что деревья, "сбалансированные по весу". Но количество равное как-то надо будет обеспечить
Для начала сделать человеческий список, с этими вложениями не охота работать: PHP: $arr = [ 0 => 12, 1 => 5, 2 => 10, 3 => 10 ]; $teamCount = 2; $mid = array_sum($arr)/$teamCount; А дальше тот же совет: перебрать все возможные комбинации, только я бы искал их разницу со средним значением рейтинга. Потом отсортировал модуль этой разницы и взял бы первых 2.