Python 获取将一组对象划分为两个等长(或一个等长)子集的方法列表
问题:Python 获取将一组对象划分为两个等长(或一个等长)子集的方法列表,python,algorithm,combinations,permutation,Python,Algorithm,Combinations,Permutation,问题: IF S = {a, b, c, d, e, f, g, h, i, j} L = func(S) THEN L == [ { {a, b, c, d, e}, {f, g, h, i, j} }, { {a, b, c, d, f}, {e, g, h, i, j} }, { {a, b, c, d, g}, {f, e, h, i, j} }, ... ] SUCH THAT { {a, b, c, d, e}, {f, g, h, i, j} } ==
IF
S = {a, b, c, d, e, f, g, h, i, j}
L = func(S)
THEN
L == [
{ {a, b, c, d, e}, {f, g, h, i, j} },
{ {a, b, c, d, f}, {e, g, h, i, j} },
{ {a, b, c, d, g}, {f, e, h, i, j} },
... ]
SUCH THAT
{ {a, b, c, d, e}, {f, g, h, i, j} }
== { {f, g, h, i, j}, {a, b, c, d, e} }
== { {e, d, a, b, c}, {g, i, j, f, h} }
- 集合S中存在n唯一对象
- 获取一个各种方法的列表L,S可分为2个子集,以便:
- 如果n为偶数,则两个子集的长度相同
- 如果n为奇数,则两个子集的长度仅相差1
- L是包含两个子集的集合列表(两个集合的集合列表)
- L不包含重复项
IF
S = {a, b, c, d, e, f, g, h, i, j}
L = func(S)
THEN
L == [
{ {a, b, c, d, e}, {f, g, h, i, j} },
{ {a, b, c, d, f}, {e, g, h, i, j} },
{ {a, b, c, d, g}, {f, e, h, i, j} },
... ]
SUCH THAT
{ {a, b, c, d, e}, {f, g, h, i, j} }
== { {f, g, h, i, j}, {a, b, c, d, e} }
== { {e, d, a, b, c}, {g, i, j, f, h} }
目的:我需要列出所有可能的方法,将不同数量的球员分成两个相等(或几乎相等)的球队
我到目前为止尝试的内容:我能够使用itertools.combines
函数在python中编写此代码。然而,我这样做似乎效率低下。我得到了一个子集的所有组合,并通过从第一个子集减去原始集得到了第二个子集。但是,因为我需要考虑这样一个事实,球员进入哪支球队并不重要,我必须基本上把这个组合分成两半
这就是我所拥有的
import itertools as it
import math
def divide(players: set[int]):
comb = it.combinations(players, math.floor(len(players) / 2))
rtn = []
for team in comb:
a = frozenset(team)
b = frozenset(players - a)
element = {a, b}
if element not in rtn:
rtn.append(element)
return rtn
你应该尝试回溯。它的速度快,使用很少的线
n=int(输入())
#解决方案清单
#对于l中的每个l,l[i]=如果球员i在A队,则为真;如果球员i在B队,则为假
L=[]
#当前解决方案
cur=[False]*n
#在每一步中,我们决定球员i的团队,
#考虑到A队已经没有A队球员了
def回溯(i,n_团队a):
n_team_b=i-n_team_a#b队球员人数
left=n-i#剩下可供选择的玩家数量
#如果我们不能拥有一支平衡的球队,即使我们让所有的球员
#留在同一组,中止
如果n_团队a+左+1
您应该尝试回溯。它的速度快,使用很少的线
n=int(输入())
#解决方案清单
#对于l中的每个l,l[i]=如果球员i在A队,则为真;如果球员i在B队,则为假
L=[]
#当前解决方案
cur=[False]*n
#在每一步中,我们决定球员i的团队,
#考虑到A队已经没有A队球员了
def回溯(i,n_团队a):
n_team_b=i-n_team_a#b队球员人数
left=n-i#剩下可供选择的玩家数量
#如果我们不能拥有一支平衡的球队,即使我们让所有的球员
#留在同一组,中止
如果n_团队a+左+1
你就快到了
从播放器中删除第一个元素,并将其记为leader
像现在一样从玩家那里发出命令
将leader
添加到输出前的第一个命令中
简单示例(无集合)
你快到了
从播放器中删除第一个元素,并将其记为leader
像现在一样从玩家那里发出命令
将leader
添加到输出前的第一个命令中
简单示例(无集合)