需要一种有效的方法将数量分解为指定的订单大小

时间:2017-07-26 20:13:32

标签: php algorithm

所以我需要一种将订单分解为指定尺寸的方法。例如:

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]。我有点不知道从哪里去。

1 个答案:

答案 0 :(得分:0)

假设阵列是有序的,你可以有两个枢轴,一个在开始,一个在最后。因此,如果您想获得特定值,您只需添加每个枢轴的两个值即可。从这个意义上讲,如果结果太小,只需移动左侧枢轴,使结果增加,结果太大,移动右侧枢轴,使结果减少。如果您没有得到所需的结果,只需添加更多的枢轴,以便您可以复制数字。