如何更好地优化程序以划分给定的和?(Python)

如何更好地优化程序以划分给定的和?(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,并且运

如果您不熟悉分区,我建议您访问此页面。它很好地解释了这一点:

在某些情况下,我试图解决的问题涉及到分区:我试图返回整数的可能分区数,这些分区数与没有重复整数的给定和相加

下面是一个简单的例子:如果输入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