python - python中的记忆硬币变化(递归解决方案)
问题描述
我对python相当陌生,我正在练习我在网上找到的几个问题(这个是eulerproject q31)。我想出了2种方法来解决它。问题:找出使用特定硬币组(例如美元 {1,5,10,25})为给定金额找零的所有方法
这是我的递归解决方案的代码
def count(s, m, n):
if (n < 0):
return 0;
if (m <=0 and n >= 1):
return 0
if (n == 0):
return 1
return count( s, m - 1, n) + count(s, m, n-s[m-1] );
S 是硬币组 {1,5,10,25} m 是硬币组的长度(在本例中为 4),n 是输入数量
这工作得很好,除了当我尝试给它一个更大的值,比如 7000 时,我在网上查了一下,似乎我的解决方案将包括多次包含先前递归迭代的子问题(使其达到最大递归限制) . 我试图弄清楚如何使用我可以使用 Java 但不知道如何在 python 中处理的 memoization 来做到这一点。任何人都可以就我应该如何记忆这个算法提供任何指导,以便它跳过检查已经检查过的子问题吗?谢谢!
解决方案
存储您计算的金额。
def make_change(coins, n):
dic_ways = {}
def helper(index, n):
if n == 0:
return 1
if n < 0:
return 0
num_ways = 0
for i in range(index, len(coins)):
coin = coins[i]
if n - coin not in dic_ways:
num_ways += helper(i + 1, n - coin)
dic_ways[n-coin] = True
return num_ways
return helper(0, n)
如您所见,n 是数量。当您遇到已计算的金额时,您只需跳过它。
推荐阅读
- jquery - 根据jquery中的单词匹配搜索数据表
- android - 如何通过单击菜单项来实现波纹动画?
- scala - 在哪种情况下使用合并与重新分区更好
- ios - UItextfied Keyboad returnkeyType 文本的本地化
- flutter - 水平可滚动的标签集中在中心,并在颤动中捕捉
- javascript - 如何使用 JQuery 在 TextBox 中粘贴文本
- sql-server - RING_BUFFER_CONNECTIVITY - LoginTimers - 在 MSSQL 中释放未使用的数据库连接时记录错误 17830
- python - 我想提取 QSTS_ID 列并用句号分隔并将其作为单独的列附加到现有列表中
- django - 多数据库环境中的 Django 模型实例 getattr
- amazon-ecs - 在网络负载均衡器 + 目标组后面运行 SSH 的 AWS ECS 服务使用 CodeDeploy 部署缓慢