如何更好地优化程序以划分给定的和?(Python)
如果您不熟悉分区,我建议您访问此页面。它很好地解释了这一点: 在某些情况下,我试图解决的问题涉及到分区:我试图返回整数的可能分区数,这些分区数与没有重复整数的给定和相加 下面是一个简单的例子:如果输入10,分区(9,1)和(8,2)将计数,因为每个值都是唯一的,分区的总和是10。但是,如果分区类似于(5,2,1,1,1,),它将不会通过,因为一旦它被分解为唯一值,它就是(5,2,1,),这不会增加到10 我编写了一个解决方案,用较小的数字完成任务,比如10。但是,该问题的测试用例为200,并且运行时间非常长 我知道问题在于分区本质上是指数型的,但我不认为我有能力想出一种优化代码的方法 这是我的密码:如何更好地优化程序以划分给定的和?(Python),python,algorithm,partitioning,subset-sum,Python,Algorithm,Partitioning,Subset Sum,如果您不熟悉分区,我建议您访问此页面。它很好地解释了这一点: 在某些情况下,我试图解决的问题涉及到分区:我试图返回整数的可能分区数,这些分区数与没有重复整数的给定和相加 下面是一个简单的例子:如果输入10,分区(9,1)和(8,2)将计数,因为每个值都是唯一的,分区的总和是10。但是,如果分区类似于(5,2,1,1,1,),它将不会通过,因为一旦它被分解为唯一值,它就是(5,2,1,),这不会增加到10 我编写了一个解决方案,用较小的数字完成任务,比如10。但是,该问题的测试用例为200,并且运
def solution(n):
arr = []
count = 0
def partitions(num, I=1):
yield (num,)
for i in range(I, num//2 + 1):
for p in partitions(num-i, i):
yield (i,) + p
arr = list(partitions(n))
for part in arr:
if sum(sorted(list(set(part)))) == n and len(part) > 1:
count += 1
return count
#input: 10 ---> output: 9
#input: 3 ---> output: 1
#input: 50 ---> output: 3657
使用内置的Python记忆工具将整数的分区计算为不同的部分(对于参数200非常有效) 结果比您的多出一个,因为一个部分分区也被计数(
3->3,2+1
)
什么是分区?答案和OEIS序列在您链接到的维基百科文章中。@Dave是的,手工打印的打字错误
import functools
@functools.lru_cache(maxsize=None)
def growparts(n, last = 0):
if n == 0:
return 1
result = 0
for i in range(last + 1, n + 1):
result += growparts(n - i, i)
return result
print(growparts(50))
>>> 3658