您可能可以通過遞歸來解決這個問題。下面顯示了基本輪廓,但是忽略了一些細節,比如一個團隊由一定數量的特定類型的球員組成。
players=[{'name':'A','score':5,'cost':10},
{'name':'B','score':10,'cost':3},
{'name':'C','score':6,'cost':8}]
def player_cost(player):
return player['cost']
def player_score(player):
return player['score']
def total_score(players):
return sum(player['score'] for player in players)
def finance_team_recurse(budget, available_players):
affordable_players=[]
for player in available_players:
if player_cost(player)<=budget:
# Since we've ordered available players, the first player appended
# will be the one with the highest score.
affordable_players.append(player)
result=[]
if affordable_players:
candidate_player=affordable_players[0]
other_players=affordable_players[1:]
# if you include candidate_player on your team
team_with_candidate=finance_team_recurse(budget-player_cost(candidate_player),
other_players)
team_with_candidate.append(candidate_player)
score_of_team_with_candidate=total_score(team_with_candidate)
if score_of_team_with_candidate>total_score(other_players):
result=team_with_candidate
else:
# if you exclude candidate_player from your team
team_without_candidate=finance_team_recurse(budget, other_players)
score_of_team_without_candidate=total_score(team_without_candidate)
if score_of_team_with_candidate>score_of_team_without_candidate:
result=team_with_candidate
else:
result=team_without_candidate
return result
def finance_team(budget, available_players):
tmp=available_players[:]
# Sort so player with highest score is first. (Greedy algorithm?)
tmp.sort(key=player_score, reverse=True)
return finance_team_recurse(budget,tmp)
print(finance_team(20,players))
# [{'score': 6, 'cost': 8, 'name': 'C'}, {'score': 10, 'cost': 3, 'name': 'B'}]
20 choose 1 = 20 combinations
150 choose 4 = 20260275 combinations
100 choose 2 = 4950 combinations
因此,有總共在teams
字典20 * 20260275 * 20260275 * 4950 = 40637395564486875000L 項目。這需要很多內存。
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):
#Don't collect the results into a dict.
#That's what's killing you (memory-wise).
#Just compute the cost and
#Just print the result here.
PS。 40637395564486875000L的訂單是10**19
。假設你的程序可以每秒處理10**6
組合,這將需要大約1.3百萬年的程序來完成...
我一千年,電腦會更快! – florin 2010-10-12 19:13:09
+1:正確使用combinatorics。這是可計算性的一個教科書示例** O **複雜性和不能做什麼。輝煌。想要多花點時間。 – 2010-10-12 19:35:56
行不行好? – user317225 2010-10-12 19:41:44