下面是一些伪代码
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