Возвращать комбинации обратно из запомнившегося алгоритма сумм подмножеств?
Я работал над основной проблемой суммы подмножеств. Учитывая сумму, скажем, 6, и числа [1,2,3,4,5,6]), мне нужно было найти общее количество комбинаций, которые составили s (для s=6: [1,5], [2,4], [1,2,3]).
Мне удалось решить это с помощью грубой силы, я не смог найти способ запомнить это, поэтому мой код не работает при достаточно больших значениях n.
Я нашел здесь запомненный алгоритм, который работает довольно хорошо, но он дает мне только количество комбинаций (так что для s = 6 количество комбинаций будет 3), а не сами комбинации. Можно ли как запоминать эту проблему (чтобы я мог запустить ее для очень больших значений s), так и иметь возможность выводить сами комбинации?
1 ответ
Вы можете упростить вашу проблему, используя itertools.combinations()
как:
>>> from itertools import combinations
>>> s = 6
>>> my_list = range(1, s)
# Value of 'my_list':
# [1, 2, 3, 4, 5]
>>> my_combinations = [combinations(my_list, i) for i in range(2, s)]
# Value of 'my_combinations' (in actual will be containg <combinations> objects):
# [[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)], [(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)], [(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 4, 5), (1, 3, 4, 5), (2, 3, 4, 5)], [(1, 2, 3, 4, 5)]]
>>> my_required_set = [my_set for my_sublist in my_combinations for my_set in my_sublist if sum(my_set) == s]
>>> my_required_set
[(1, 5), (2, 4), (1, 2, 3)]