下面是一些僞代碼
function player_combos(array players, int minimum_total) {
array result = []
players = sort(players, metric=most points first)
int total = 0
for p1 in 0 .. length(players) {
if players[p1].points*10 < minimum_total - total:
break
total += players[p1].points
for p2 in p1+1 .. length(players) {
if players[p2].points*9 < minimum_total - total:
break
total += players[p2].points
for p3 in p2+1 .. length(players) {
if players[p3].points*8 < minimum_total - total:
break
total += players[p3].points
# continue these nested loops up to p10
...
for p10 in p9+1 .. length(players):
if players[p10].points < mininum_total - total:
break
# this is a valid combination
result.append((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10))
...
# remember to decrement total when we finish a loop iteration
total -= players[p3].points
}
total -= players[p2].points
}
total -= players[p1].points
}
return result
}
這裏的想法是,因爲你有玩家進行排序第一,在任何時候,而上循環播放列表中,所有玩家之後必須有相同或更低總分爲當前球員。如果當前玩家的積分乘以隊伍中剩餘的積分數量少於達到最小值所需的積分數量,則您可以跳出當前循環。
例如,假設您目前隊伍中有四名球員總共得到80分,這意味着您還剩下90分即可達到最低分,還剩下6分。你的下一個玩家可以擁有的絕對最少點數是15(90/6 == 15),所以當你到達一個有14個或更少點的下一個循環中的玩家時,你可以跳出這個循環。
只要您的minimum_total指標設置得足夠高,這應該大大減少您需要獲取的組合總數。
我在這裏預見的問題是100選10有1.73103095×10e13的組合。如果你想要任何滿足條件的10名球員,我會建議根據他們的價值對球員進行排序,並根據排名選擇他們。 – twain249 2012-03-07 22:39:18
等等,你想用Python或C++來做到這一點嗎?你可以在沒有Python的庫的情況下做到這一點,以實際學習邏輯... – 2012-03-07 22:40:18
循環所有的組合和測試是做錯的方法,因爲它是O(n!)@ twain249指出,這導致不切實際的迭代次數。您將需要使用動態編程以高效的方式解決此問題 – 2012-03-07 22:45:34