我的问题源于生成一个非常大的素数排序列表的唯一组合选择 5,但我需要返回组合,以便首先返回总和最小的组合。pythonitertools.combinations()
函数返回数字,增加最后一个直到它到达可迭代对象的末尾,然后再增加下一个,等等。这不适合我的项目,因为总和将继续增加,直到它到达我集合的最后一个元素质数,此时总和将下降,然后再次增加。
例如,如果我有一小组 primes {2,3,5,7,11,13,17,19,23,29}
,我需要按以下顺序返回组合:
(2, 3, 5, 7, 11) sum = 28
(2, 3, 5, 7, 13) sum = 30
(2, 3, 5, 7, 17) sum = 34
(2, 3, 5, 11, 13) sum = 34
(2, 3, 5, 7, 19) sum = 36
(2, 3, 7, 11, 13) sum = 36
(2, 3, 5, 11, 17) sum = 38
(2, 5, 7, 11, 13) sum = 38
(3, 5, 7, 11, 13) sum = 39
(2, 3, 5, 7, 23) sum = 40
(2, 3, 5, 11, 19) sum = 40
(2, 3, 5, 13, 17) sum = 40
(2, 3, 7, 11, 17) sum = 40
(2, 3, 5, 13, 19) sum = 42
(2, 3, 7, 11, 19) sum = 42
(2, 3, 7, 13, 17) sum = 42
(2, 5, 7, 11, 17) sum = 42
...
两个总和相同的集合的顺序无关紧要,只要生成器在总和较小的集合之前不返回总和较大的集合即可。我正在使用的素数集包含大约 100,000 个元素,这意味着简单地生成所有组合并对它们进行排序是非常不可行的,因为它需要 83,325,000,291,662,500,020,000 个元组的空间,每个元组有 5 个整数。此外,返回的组合元组中的每个元素都必须是唯一的;不能有重复的整数。有任何想法吗?