我有24件独特的东西。
我需要把它们分成6组,每组4个项目。
考虑到顺序不相关,我可以使用什么算法来迭代这24个项的所有可能组合/分隔
例如,其中一种组合是:
ABCD-EFGH-IJKL-MNOP-QRST-UVWX格式
^因为顺序不重要,所以这与:
DCBA-HGFE-LKJI-POMN-TSRQ-XWVU型
^但它们不同于:
AFCD-EBGH-IJKL-MNOP-QRST-UVWX型
……这是一个独特的组合。
所以我想重申一下:考虑到我需要将24个项目分成6组,每组4个,我正在努力找出如何从中获得所有可能的组合。
另外,6个组的顺序也不重要含义:“abcd-efgh-ijkl-mnop-qrst-uvwx”与“efgh-ijkl-mnop-qrst-uvwx-abcd”相同
注意:在java中实现这个功能的帮助会很好。
谢谢!
编辑:
如果解决方案是:
(1)我首先试着找出24个项目中所有可能的4人小组。
(2)然后我找到所有可能的六个组,给定由1产生的组
思想?

最佳答案

对于此类问题,一个常见的攻击角度是为要枚举的每个对象定义一个规范表示,然后使用带有修剪的递归。对于您的特定问题,让我们规定规范表示法将每个组中的字母以及组本身按顺序排序。使用递归,我们以所有可能的方式执行以下操作。把A放在第一组。把B放在第一组或第二组。如果A和B在一起,把C放在第一组或第二组。如果A和B分开,将C放在第一、第二或第三组中。一般来说,把每个连续的字母放在一个已经有字母的组中,或者放在第一个空的组中。
蟒蛇:

def combinations(unassigned, groupcountmax, groupsizemax, groups=()):
    if not unassigned:
        yield groups
    else:
        x, unassigned1 = unassigned[0], unassigned[1:]
        for i, group in enumerate(groups):
            if len(group) < groupsizemax:
                yield from combinations(unassigned1, groupcountmax, groupsizemax,
                                        groups[:i] + (group + x,) + groups[i+1:])
        if len(groups) < groupcountmax:
            yield from combinations(unassigned1, groupcountmax, groupsizemax,
                                    groups + (x,))

把24个项目分成6个4组需要相当长的时间,因为有24个!/(6(四!)^ 6)~4.5e12个。

关于java - 我有24个项目,需要分成6组,每组4个。我可以使用什么算法找到所有可能的组合?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23679648/

10-12 14:13