【问题标题】:Sum of subsets using Python with class使用带有类的 Python 的子集总和
【发布时间】:2020-03-24 10:56:08
【问题描述】:

我正在尝试使用 Python 和递归来解决子集之和问题。子集和问题应该找出是否存在一组数字的子集,其中子集的和等于目标值。我尝试了以下代码的许多变体。

据我所知,它总是停在最左边最深的分支。

它应该生成一棵树。树得到一个数据列表和一个值。该值最初为 0。然后它填充它的孩子。每个节点有 2 个孩子。两个孩子的数据都是父母的数据,去掉了最大值。但是一个孩子会把它添加到价值中,而一个不会。

例如

Set: (1, 4, 5, 3, 8)
Target: 4
Subsets: (1, 3), (4)

树示例(深度到第 2 级):

- 0 (1, 4, 5, 3, 8)
-- 1 (4, 5, 3, 8)
---- 5 (5, 3, 8)
---- 1 (5, 3, 8)
-- 0 (4, 5, 3, 8)
---- 4 (5, 3, 8)
---- 0 (5, 3, 8)
class Tree:
    def __init__(self, value, data, target):
        self.value = value
        self.target = target
        self.data = data
        self.children = list()

        if self.value == target:
            print("Target found!")
            print(self.children)
            print(self.value)

        if len(self.data) != 0 and self.value < target:
            self.populate()

    def populate(self):
        top_val = self.data.pop()
        self.children.append(Tree(self.value + top_val, self.data, self.target))
        self.children.append(Tree(self.value, self.data, self.target))

    def print_children(self):
        print("value", self.value)
        for child in self.children:
            child.print_children()


if __name__ == "__main__":
    numbers = [3, 34, 4, 12, 5, 2]
    tree = Tree(0, numbers, 9)
    tree.print_children()

这是上面代码的输出:

value 0
value 2
value 7
value 19
value 7
value 11
value 7
value 41
value 7
value 10
value 7
value 2
value 0

【问题讨论】:

  • 集合是否只有正整数?
  • @MarkMeyer 是的,但包括 0。
  • “感谢所有帮助。” Stack Overflow 是针对有关编程的特定问题;除了一般帮助之外,您还不清楚您要求什么。如果您的代码有效,请在问题中说明并询问具体内容;如果不起作用,请提供输入、预期结果和实际结果。
  • @kaya3 为更清晰而编辑。
  • 上一个问题能否提供一些见解?检查了吗? stackoverflow.com/questions/23087820/python-subset-sum

标签: python algorithm recursion computer-science


【解决方案1】:

问题在于 self.data 被设置为对数据的引用,而不是副本。

这意味着所有 Tree 节点都指向完全相同的数据数组,因此当您调用 pop 时,这些值将从数据中永久删除。

解决此问题的两种方法:

方法一

改变

self.data = data

self.data = data[:]

这会为每个 Tree 节点获取一份数据。

方法二

添加行

self.data.append(top_val)

在填充调用结束时。

这会将您弹出的值放回数组中。

方法 2 使用的内存更少,但更容易出错,因为每个树对象仍然共享相同的数据数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2012-02-19
    • 1970-01-01
    相关资源
    最近更新 更多