Функции и генераторы очень помогают:
def make_teams(G, D, M, S):
""" returns all possible teams """
for gk in itertools.combinations(G,1):
for de in itertools.combinations(D,4):
for mi in itertools.combinations(M,4):
for st in itertools.combinations(S,2):
yield gk, de, mi, st
def get_cost( team ):
return sum( member.cost for member in team )
def good_teams( min_score=0):
for team in make_teams(G, D, M, S):
if get_cost( team ) > min_score:
yield team
for team in good_teams(min_score=100):
print team
Он по-прежнему генерирует все возможные комбинации, так что вам, вероятно, не хватит времени вместо памяти.
То, что вы делаете, похоже на вариацию задачи о ранце - вы можете сделать лучше, чем попробовать все возможные комбинации, но не намного лучше .
Один из способов быстро найти хорошее решение - отсортировать игроков по их счету за деньги . Сначала вы должны получить лучшие команды, но нет никаких гарантий, что вы получите лучшее из возможных решений. Википедия называет это «алгоритмом жадного приближения».
def score_per_cost( player ):
return player.score / player.cost
def sorted_combinations(seq, n):
return itertools.combinations(
sorted(seq, key=score_per_cost, reverse=True),n)
def make_teams(G, D, M, S):
""" returns all possible teams """
for gk in sorted_combinations(G,1):
for de in sorted_combinations(D,4):
for mi in sorted_combinations(M,4):
for st in sorted_combinations(S,2):
yield gk, de, mi, st
def get_cost( team ):
return sum( member.cost for member in team )
def top_teams(n):
return itertools.islice(make_teams(G, D, M, S),n)
for team in top_teams(100):
print team
Я оставлю добавление читателю требования «стоимость на команду <порог» (подсказка: это одна строка в <code>make_teams: p).