Skip to main content
 首页 » 编程设计

python之加权字符串的组合 : Count the number of integer combinations with sum(integers) = m

2025年05月04日21落叶无声

给定一个整数列表,例如

l = [3, 5, 8, 13] 

和一个整数,例如

m = 13 

计算 sum=m 的整数组合的数量,例如

combinations = len([[8, 5], [5, 8], [13], [3, 5, 5], [5, 5, 3], [3, 5, 3], ...]) 

对于较小的 m 值,我可以使用此递归(类似斐波那契的线性递归关系):

def RecursiveCount(m, integers): 
    count = 0 
    if m < 0: 
        return 0 
    if m == 0: 
        return 1 
    for i in integers: 
        count += RecursiveCount(m-i, integers) 
    return count 

但是对于较大的 l 和 m,它会变慢,建议使用动态规划来记住已经解决的组合以减少递归调用。不幸的是,我无法实现这一点。我尝试阅读此内容,但没有帮助 https://bio.informatik.uni-jena.de/wp/wp-content/uploads/2014/09/book_handout_3.pdf

编辑:学习成果将是最大的,如果我能够使用动态规划来实现它

请您参考如下方法:

您可以通过添加 @functools.lru_cache 轻松添加内存。递归函数的装饰器。

@functools.lru_cache() 
def RecursiveCount(m, integers): 
    ... 

这将自动缓存某些参数的结果,并在再次调用该函数之前先检查该缓存,从而显着减少调用次数,从而减少运行时间。但是,这要求所有参数都是可哈希的,即您必须将 integers 作为 tuple 传递。

RecursiveCount(20, tuple(range(1, 10)))) 示例:结果:518,145;没有内存的函数调用:4,672,513;带内存:29.

(如果这是用于 DP 的练习,这可能不是一个选项,但在实践中这很有效。)