Item, 'quantity' => ?] * @param Backpack $backpack Backpack to fill * * @return Backpack * * @since 1.0.0 */ public static function solve(array $items, Backpack $backpack) : Backpack { usort($items, function($a, $b) { return $a['item']->getValue() / $a['item']->getCost() < $b['item']->getValue() / $b['item']->getCost(); }); $availableSpace = $backpack->getMaxCost(); foreach ($items as $item) { if ($availableSpace <= 0.0) { break; } $backpack->addItem( $item['item'], $quantity = \min($item['quantity'], $availableSpace / $item['item']->getCost()) ); $availableSpace -= $quantity * $item['item']->getCost(); } return $backpack; } }