我有一个整数列表
keys = [18, 99, 86, 61, 66, 81, 98, 19, 91, 16, 69, 88, 89, 68, 11, 96]
我想找到this列表的所有排列,以便每个排列
元素0到3总计为264,
元素4至7总计为264,
元素8到11总计为264和
元素12到15,最多264个。
当前我有以下策略
使用itertools.permutations计算所有排列
检查哪些排列满足我的条件
还有另一种效果更好的策略吗?
好吧,这是一个初步的想法。它生成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)
我为难看的代码表示歉意,但我认为在问题解决之前获得解决方案很重要。
好吧,这是一个初步的想法。它生成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)
我为难看的代码表示歉意,但我认为在问题解决之前获得解决方案很重要。