private function buildCombinations($quantity)
    {
        if (empty($this->map)) {
            return [];
        }

        $combinations = [];

        // Size 1
        foreach ($this->map as $id => $qty) {
            $combinations[] = new AssignmentCombination([$id => $qty], $diff = $qty - $quantity);

            if ($diff == 0) {
                return $combinations;
            }
        }

        // Size 1 < size < max
        for ($length = 2; $length < count($this->map); $length++) {
            foreach (combine_assoc($this->map, $length) as $map) {
                $combinations[] = new AssignmentCombination($map, $diff = array_sum($map) - $quantity);

                if ($diff == 0) {
                    return $combinations;
                }
            }
        }

        // Size max
        $combinations[] = new AssignmentCombination($this->map, array_sum($this->map) - $quantity);

        return $combinations;
    }