在partition problem我已经理解了伪多项式时间算法。但是我无法打印平衡集。
我无法弄清楚在algo构造的表中存储什么而不是布尔值。
请提供algo打印分区子集。
您能提供解决方案,我可以修改构造的表来实现分区值。
答案 0 :(得分:1)
解决分区问题基本上是基于公式:
D(i,0) = true
D(0,x) = false if x!=0
D(i,x) = D(i-1,x-arr[i]) OR D(i-1,x)
为了重现实际元素,你可以存储另一个矩阵,表明是否采用了元素,让这个矩阵为Q
。
换句话说,Q(i,x) = true
当且仅当D(i-1,x-arr[i]) = true
。
现在,您可以使用以下内容重现该集:
set1 = {}
set2 = {}
x = SUM/2
for i from n to 0 decreasing:
if Q(i,x):
x = x - arr[i]
set1.add(arr[i])
else:
set2.add(arr[i])
替代方案不需要构建第二个矩阵Q
,而是回溯您的步骤。基本思想与前一个非常相似。
set1 = {}
set2 = {}
x = SUM/2
for i from n to 0 decreasing:
if D(i-1,x-arr[i]):
// ^^ The condition was changed ^^
x = x - arr[i]
set1.add(arr[i])
else:
set2.add(arr[i])
这个想法很相似,如果通过添加元素获得有效的解决方案,将其添加到set
,它就是分区的一部分。否则,它不是分区的一部分。