<?php
$percent = [20.88, 14.93, 14.14, 13.29, 5.06, 4.43, 4.24, 4.22, 2.57, 2.51, 2.38, 2.18, 1.94, 1.80, 1.34, 1.21, 0.81, 0.63, 0.50, 0.48, 0.30, 0.16];
$limit = 6;
if ($limit * count($percent) < 100) die("Not possible");
$limited = array_map(function($value) use ($limit) { return min($value, $limit); }, $percent);
while (($remain = 100 - array_sum($limited)) > 0) {
$filtered = array_filter($limited, function($v) use ($limit) { return $v < $limit; });
$evenly = $remain / count($filtered);
$limited = array_map(function($value) use ($evenly, $limit) { return min($value + $evenly, $limit); }, $limited);
}
print_r($limited);
print_r(array_sum($limited));
preferences:
54.21 ms | 402 KiB | 5 Q