Используя itertools, вам не понадобится рекурсивное решение. Итератор комбинаций комбинаций_символов предоставит вам комбинации, и вам нужно только проверить свои условия. Для вашего требования вам понадобится блок питания комбинаций (то есть комбинаций всех размеров):
например:
from itertools import combinations_with_replacement as combine
my_list = [400, 200, 100, 50, 25]
my_dict = {400: 8, 200:4, 100: 2, 50: 2, 25: 2}
for size in range(2,len(my_list)+1):
for combo in combine(my_list, size):
if sum(combo) <= 1200 \
and sum(my_dict[c] for c in combo) <= 24:
print(combo)
Вы можете поместите это в функцию и используйте yield combo
вместо print(combo)
, если вы собираетесь каким-либо образом обрабатывать комбинации
output:
(400, 400)
(400, 200)
(400, 100)
(400, 50)
(400, 25)
...
(50, 50, 50, 50, 50)
(50, 50, 50, 50, 25)
(50, 50, 50, 25, 25)
(50, 50, 25, 25, 25)
(50, 25, 25, 25, 25)
(25, 25, 25, 25, 25)
Обратите внимание, что это Это неоптимизированный подход грубой силы, который может быть приемлем для небольших наборов данных, но займет экспоненциальное количество времени, так как у вас есть больше данных. Существуют более продвинутые методы (с использованием рекурсии), которые пропускают целые серии комбинаций, проверяя частичные суммы и / или используя meoization.