python - 加权字符串的组合:用 sum(integers) = m 计算整数组合的数量
问题描述
给定一个整数列表,例如
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 的练习,这可能不是一个选项,但否则这在实践中效果很好。)
推荐阅读
- python - 在训练周期的一部分之后运行评估
- git - `git diff tag` 中的标签指的是哪里?它如何找到标签指向的位置?
- sql - 如何替换确切的字符串
- node.js - 在 Mongoose 内部查找中放松身心
- sql - 在 SQLite3 的寄存器中存储带有 SQL 代码的字符串
- java - Java SE 中的事务类型
- r - 如何在 KableExtra 的表中插入 html
- javascript - 使用 jQuery 或 JavaScript 添加平滑滚动
- cassandra - 节点可用 3 cpu 不足
- android - makeSceneTransitionAnimation 在使用 AndroidX 时显示错误