所以我需要一种将订单分解为指定尺寸的方法。例如:
orderBreakdown(40, [4, 8, 12, 16]);
将返回[16, 16, 8]
(订单数组)。它需要具有最有效的故障(不能是12,12,12,4)。它也必须非常灵活 - 它可能会失败(显然有些数量不能被分解,例如在这种情况下为39)。
现在我有:
function quantityBreakdown(int $count, array $units)
{
sort($units);
$units = array_reverse($units); //order units from large to small
$orders = [];
$original_count = $count;
while ($count > 0 && !empty($units))
{
for($i = 0; $i < count($units); $i++)
{
$unit = $units[$i];
while($count >= $unit){
array_push($orders, $unit);
$count = $count - $unit;
}
}
if ($count > 0){
$count = $original_count;
$orders = [];
array_shift($units);
}
}
return $orders;
}
这适用于很多情况:
例如,quantityBreakdown(19, [6, 8, 11, 17]);
将返回[11, 8]
。但在某些情况下它会返回非最佳结果。 quantityBreakdown(36, [6, 8, 11, 17])
会返回[6, 6, 6, 6, 6, 6]
,最佳时会返回[17, 11, 8]
。我有点不知道从哪里去。
答案 0 :(得分:0)
假设阵列是有序的,你可以有两个枢轴,一个在开始,一个在最后。因此,如果您想获得特定值,您只需添加每个枢轴的两个值即可。从这个意义上讲,如果结果太小,只需移动左侧枢轴,使结果增加,结果太大,移动右侧枢轴,使结果减少。如果您没有得到所需的结果,只需添加更多的枢轴,以便您可以复制数字。