具有16个整数的列表的排列,但仅当列表的4个子部分加起来等于264 [关闭]

问题描述 投票:3回答:1

我有一个整数列表

keys = [18, 99, 86, 61, 66, 81, 98, 19, 91, 16, 69, 88, 89, 68, 11, 96]

我想找到this列表的所有排列,以便每个排列

  1. 元素0到3总计为264,

  2. 元素4至7总计为264,

  3. 元素8到11总计为264和

  4. 元素12到15,最多264个。

当前我有以下策略

  1. 使用itertools.permutations计算所有排列

  2. 检查哪些排列满足我的条件

还有另一种效果更好的策略吗?

python combinations permutation constraint-satisfaction
1个回答
1
投票

好吧,这是一个初步的想法。它生成4x4集的子集的组合,这些子集的总和总计为264(只有25种此类有序组合)。

接下来,您需要对25个组合中的每一个中的4组中的每组进行置换。这将产生大约830万个解决方案。这种方法比暴力破解和检查快260万倍。

from itertools import combinations

keys = [18, 99, 86, 61, 66, 81, 98, 19, 91, 16, 69, 88, 89, 68, 11, 96]
keys_set = set(keys)

def f(key_set):

    for i in combinations(keys_set,4):
        if sum(i) == 264:
            rem_set = keys_set - set(i)
            for j in combinations(rem_set,4):
                if sum(j) == 264:
                    rem_set = rem_set - set(j)
                    for k in combinations(rem_set,4):
                        if sum(k) == 264:
                            rem_set = rem_set - set(k)
                            if sum(rem_set) == 264:
                                yield i,k,j,rem_set

for i in f(keys_set):
    print(i)

我为难看的代码表示歉意,但我认为在问题解决之前获得解决方案很重要。


0
投票

好吧,这是一个初步的想法。它生成4x4集的子集的组合,这些子集的总和总计为264(只有25种此类有序组合)。

接下来,您需要对25个组合中的每一个中的4组中的每组进行置换。这将产生大约830万个解决方案。这种方法比暴力破解和检查快260万倍。

from itertools import combinations

keys = [18, 99, 86, 61, 66, 81, 98, 19, 91, 16, 69, 88, 89, 68, 11, 96]
keys_set = set(keys)

def f(key_set):

    for i in combinations(keys_set,4):
        if sum(i) == 264:
            rem_set = keys_set - set(i)
            for j in combinations(rem_set,4):
                if sum(j) == 264:
                    rem_set = rem_set - set(j)
                    for k in combinations(rem_set,4):
                        if sum(k) == 264:
                            rem_set = rem_set - set(k)
                            if sum(rem_set) == 264:
                                yield i,k,k,rem_set

for i in f(keys_set):
    print(i)

我为难看的代码表示歉意,但我认为在问题解决之前获得解决方案很重要。

© www.soinside.com 2019 - 2024. All rights reserved.