当前位置: 首页 > 知识库问答 >
问题:

从记忆子集和算法中获取组合?

龙德义
2023-03-14

我一直在研究一个基本的子集和问题。给定一个和,比如说6,和数字[1,2,3,4,5,6]),我必须找到总的组合数s(对于s=6:[1,5],[2,4],[1,2,3])。

我已经能够用蛮力解决这个问题,但还没有找到记忆它的方法,所以我的代码对于足够大的n值是不可行的。

我在这里找到了一个非常有效的记忆算法,但是它只给我组合的数量(所以,对于s=6,组合的数量将是3)——而不是组合本身。是否有可能既记忆这个问题(以便我可以对非常大的s值运行它)又能够输出组合本身?

共有1个答案

常海
2023-03-14

您可以使用itertools简化问题。组合()

>>> from itertools import combinations
>>> s = 6
>>> my_list = range(1, s)
# Value of 'my_list':
# [1, 2, 3, 4, 5]

>>> my_combinations = [combinations(my_list, i) for i in range(2, s)]
# Value of 'my_combinations' (in actual will be containg <combinations> objects):
# [[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)], [(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)], [(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 4, 5), (1, 3, 4, 5), (2, 3, 4, 5)], [(1, 2, 3, 4, 5)]]

>>> my_required_set = [my_set for my_sublist in my_combinations for my_set in my_sublist if sum(my_set) == s]
>>> my_required_set
[(1, 5), (2, 4), (1, 2, 3)]
 类似资料:
  • 我刚刚读了一些关于G1算法的博客。 我对记忆集的用法感到困惑。 以下是我的想法: 既然我们可以使用DFS遍历来自GC根的每个引用,为什么我们需要记住集合? 因为所有的博客都说我们使用的原因是,我们不需要检查每个区域,看看是否有一个对象被GC-Roots引用

  • 问题内容: 我有并想要一些函数,调用的结果是新数组。 问题答案: 看一眼

  • 问题内容: 我有一个程序可以通过递归传递大量数据,例如1000个变量。递归将至少运行50或60次。我担心的是,由于没有足够的空间,是否有可能数据在内存位置上被覆盖,或者如果没有内存,那么我会得到一些例外,即程序内存已经用完(我没有收到这样的错误)? 是否存在错误的解决方案,因为该程序没有更多的内存并且在现有位置上被覆盖? 问题答案: 涉及两个存储区域:堆栈和堆。堆栈是保存方法调用的当前 状态 (即

  • 在第一个屏幕截图中,集合用户中有许多文档。每个文档都包含进一步的集合jobPost,该集合包含进一步的文档及其元数据。 我在这里想要的是去收集用户的每个文档和进一步的子收集jobPost并获取所有文档。假设首先它应该转到集合用户中的文档1,在文档1中它应该获取子集合jobPost中的所有文档,然后它应该转到集合用户的第二个文档,然后获取子集合jobPost中的所有文档,等等。

  • 我的想法是有一个这样的东西,您可以在其中存储以前的答案并在以后查找它们。我想这可以通过lambda表达式来完成,但我不太熟悉它们。我不太确定如何编写这个方法,希望得到一些帮助。 用这种方法能做到这一点吗?

  • 问题内容: 我正处在角度火种的教程阶段,并尝试了消息和子帖子,出于某些奇怪的原因,当我明确尝试显示子对象时,我看不到子对象,但是在控制台的父节点上展开时却可以看到子对象。这些消息在ng- repeat所在的html中正确显示,所以我知道至少得到了消息,尽管没有孩子。 我以为angularfire-seed utils可能会砍掉或切掉一些孩子,所以我回到了直火基地 这就是我所拥有的: 在此先感谢您指