使用Python和类的子集之和

使用Python和类的子集之和,python,algorithm,recursion,computer-science,Python,Algorithm,Recursion,Computer Science,我正在尝试使用Python和递归解决子集和问题。子集和问题的目的是发现一组数字中是否存在子集,其中子集和等于目标值。我已经尝试了下面代码的许多变体 据我所知,它总是停在最左边最深的树枝上。 它应该生成一棵树。树获取一个数据列表和一个值。该值最初为0。然后,它填充其子代。每个节点有2个子节点。两个子项的数据都是父项的数据,并去掉了最大值。但是,一个孩子会将其添加到价值中,而另一个孩子不会 e、 g Set:(1,4,5,3,8) 目标:4 子集:(1,3)、(4) 树示例(深度至第二级): 类树

我正在尝试使用Python和递归解决子集和问题。子集和问题的目的是发现一组数字中是否存在子集,其中子集和等于目标值。我已经尝试了下面代码的许多变体

据我所知,它总是停在最左边最深的树枝上。

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

e、 g

Set:(1,4,5,3,8)
目标:4
子集:(1,3)、(4)
树示例(深度至第二级):

类树:
定义初始化(自身、值、数据、目标):
自我价值=价值
self.target=目标
self.data=数据
self.children=list()
如果self.value==目标:
打印(“找到目标!”)
打印(self.children)
打印(自我价值)
如果len(自数据)!=0和self.value<目标:
self.populate()
def填充(自我):
top_val=self.data.pop()
self.children.append(树(self.value+top_val、self.data、self.target))
self.children.append(树(self.value、self.data、self.target))
def打印_子项(自我):
打印(“值”,自我价值)
对于在self.children中的children:
child.print_children()
如果名称=“\uuuuu main\uuuuuuuu”:
数字=[3,34,4,12,5,2]
树=树(0,数字,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

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

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

有两种方法可以解决此问题:

方法1 改变

self.data = data

这将获取每个树节点的数据副本

方法2 添加行

self.data.append(top_val)
在填充调用的末尾

这将把弹出的值放回数组中


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

设置的是唯一的正整数吗?@MarkMeyer是的,但包括0。“感谢所有帮助。”堆栈溢出是针对编程的特定问题;除了一般的帮助之外,你还不清楚你在寻求什么。如果你的代码有效,请在问题中这样说,并询问一些具体的问题;如果不起作用,请提供输入、预期结果和实际结果。@kaya3为更清楚起见进行了编辑。前面的问题能提供一些见解吗?查过了吗?
self.data = data[:]
self.data.append(top_val)