我有一个N个玩家的列表(比方说,14个玩家 - 示例中的1到14个数字)。
我想获得由X玩家制作的所有可能的Y队伍的集合。 当然可能会有玩家被遗弃。
输入示例:N = 14名队员,Y = 3队,每队由X = 3名队员组成。 这意味着14名球员,分成3队3名球员。我想要所有的可能性。
1)[123],[456],[789] 10,11,12,13,14被遗漏。
2)[456],[789],[10,11,12] 1,2,3,13,14被排除在外。 3)....
我已经查看了这篇文章,这有助于我获得所有可能的X队员队伍,我认为这可以帮助我实现目标: What is the best way to find all combinations of items in an array? 既然我拥有所有可能的X球队,我需要更进一步。当我拥有所有可能的团队元组时,我将选择最适合我的需求的组合。你们能帮助我吗? C#代码会很棒,但即使是伪代码也可以提供帮助。
答案 0 :(得分:1)
我认为你需要组合,而不是permatations。排列意味着玩家的秩序很重要。
使用扩展方法可以生成组合:
public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k) {
return k == 0 ? new[] { new T[0] } :
elements.SelectMany((e, i) =>
elements.Skip(i + 1).Combinations(k - 1).Select(c => (new[] { e }).Concat(c)));
}
因此,对于您的示例问题,请设置参数:
var N = 14;
var NumTeams = 3;
var NumPlayersPerTeam = 3;
首先,您可以生成所有玩家:
var players = Enumerable.Range(1, N);
然后,您可以通过一次组合玩家NumPlayersPerTeam
来获得所有可能的团队:
var AllTeams = players.Combinations(NumPlayersPerTeam);
然后,您可以通过一次组合团队NumTeams
来获得所有团队:
var PossibleTeamSets = AllTeams.Combinations(NumTeams);