Advent of code 2015/17
Ajax Direct

Answer

Part 1 :
Part 2 :
function solve($cups, $amount) {
    $graph = (new Graph(function ($graph) use ($cups, $amount) {
        $capacity = $graph->values[$graph->current];

        if (strlen($graph->current) == count($cups)) return [];
        if ($capacity == $amount) return [];

        return array_filter([
            $graph->current."0" => 0,
            $graph->current."1" => $cups[strlen($graph->current)]
        ], fn($cup) => $capacity + $cup <= $amount);
    }, "highest"));

    $graph->explore(function ($graph) use ($cups) {
        $graph->queue->insert("0");
        $graph->queue->insert("1");
        $graph->values = [
            "0" => 0,
            "1" => $cups[0]
        ];
    });

    return $graph;
}

// ==================================================
// > SOLUTIONS
// ==================================================
$cups = $input->numbers()->sort()->reverse();
$combinations = set(solve($cups, 150)->values)->keep(150);

$solution_1 = $combinations->count();

$requirements = $combinations->keys()->map(fn ($comb) => substr_count($comb, "1"));
$solution_2 = $requirements->keep($requirements->min())->count();