![](/img/trans.png)
[英]Finding all possible permutations of an unfixed length of numbers to reach a given sum or product
[英]Finding all possible permutations of a fixed length of numbers to reach a given sum
我想修改subset_sum()
python 函数从查找所有可能的数字组合以达到给定的总和,以便:
我已经成功完成了#2,但我需要#1 的帮助:
def subset_sum(numbers, target, length, partial=[]):
s = sum(partial)
# check if the partial sum is equals to target
if s == target and len(partial) == length:
print(f"sum({partial})={target}")
if s >= target:
return # if we reach the number why bother to continue
for i in range(len(numbers)):
n = numbers[i]
remaining = numbers[i+1:]
subset_sum(remaining, target, length, partial + [n])
所需的输出应该是:
>>> subset_sum([3,9,8,4,5,7,10],target=15,length=3)
sum([3, 8, 4])=15
sum([3, 4, 8])=15
sum([4, 3, 8])=15
sum([4, 8, 3])=15
sum([8, 3, 4])=15
sum([8, 4, 3])=15
sum([3, 5, 7])=15
sum([3, 7, 5])=15
sum([5, 3, 7])=15
sum([5, 7, 3])=15
sum([7, 3, 5])=15
sum([7, 5, 3])=15
既然你已经解决了识别每个等价组中的一个解决方案的问题,我的建议是:不要改变该算法。 相反,利用itertools.permutations
来生成这些项目:
return list(itertools.permutations(numbers))
这样做:
import itertools
numbers = [3,9,8,4,5,7,10]
length = 3
target = 15
iterable = itertools.permutations(numbers,length)
predicate = lambda x: (sum(x) == target)
vals = filter(predicate,iterable)
list(vals)
或单线:
vals = [x for x in itertools.permutations(numbers,length) if sum(x) == target]
结果:
[(3, 8, 4),
(3, 4, 8),
(3, 5, 7),
(3, 7, 5),
(8, 3, 4),
(8, 4, 3),
(4, 3, 8),
(4, 8, 3),
(5, 3, 7),
(5, 7, 3),
(7, 3, 5),
(7, 5, 3)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.