は、いくつかの擬似コードは、ここでの考え方は、リスト内のプレイヤーをループしながら、あなたが任意の時点で、最初の選手をソートしているため、後にすべてのプレイヤーが同等以下を持たなければならないということです
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ポイントのチームに4人のプレイヤーがいるとしたら、90ポイント以上が残っていて残りが6ポイント残っているということです。あなたの次のプレイヤーが持つことができるポイントの絶対最小数は、90/6 ==15から15です。したがって、次のループで14ポイント以下のプレイヤーに達すると、そのループから脱出することができます。
minimum_totalのメトリックが十分に高く設定されていれば、必要な組み合わせの総数が大幅に削減されます。
ここで私が予見する問題は、100を選択すると、1.73103095×10e13の組み合わせがあることです。条件を満たしている10人のプレイヤーが欲しいのであれば、プレイヤーをその値に基づいてソートし、そのランクに基づいてプレイヤーを選ぶことです。 – twain249
待って、これをPythonやC++でやりたいですか?あなたはPythonでライブラリを使わなくても、ロジックを実際に学ぶことができます。 –
@ twain249が指摘しているようにO(n!)なので、すべての組み合わせとテストをループするのは間違った方法です。実用的でない反復回数。効率的な方法でこれを解決するには、動的プログラミングを使用する必要があります –