Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取将一组对象划分为两个等长(或一个等长)子集的方法列表_Python_Algorithm_Combinations_Permutation - Fatal编程技术网

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唯一对象
  • 获取一个各种方法的列表LS可分为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
添加到输出前的第一个命令中

简单示例(无集合)