Комбинации с элементами в другом порядке считаются эквивалентными.Например, № 3 и № 5 из вашего списка сумм считаются эквивалентными, если вы говорите только о комбинациях.
Напротив, перестановки считают две коллекции уникальными, если они состоят из одинаковых элементов в разныхзаказ.
Чтобы получить искомый ответ, вам необходимо объединить оба понятия.
- Сначала воспользуйтесь своей техникой, чтобы найти комбинации, соответствующие вашим критериям
- Затем переставьте набор чисел из комбинации
- Наконец, соберите сгенерированные перестановки в наборе для удаления дубликатов.
[ins] In [01]: def combination_generator(numbers, k, target):
...: assert k > 0, "Must be a positive number; 'k = {}".format(k)
...: assert len(numbers) > 0, "List of numbers must have at least one element"
...:
...: for candidate in (
...: {'numbers': combination, 'sum': sum(combination)}
...: for num_elements in range(1, k + 1)
...: for combination in itertools.combinations_with_replacement(numbers, num_elements)
...: ):
...: if candidate['sum'] != target:
...: continue
...: for permuted_candidate in itertools.permutations(candidate['numbers']):
...: yield permuted_candidate
...:
[ins] In [02]: {candidate for candidate in combination_generator([1, 2], 5, 5)}
Out[02]:
{(1, 1, 1, 1, 1),
(1, 1, 1, 2),
(1, 1, 2, 1),
(1, 2, 1, 1),
(1, 2, 2),
(2, 1, 1, 1),
(2, 1, 2),
(2, 2, 1)}