在分区概率中打印分区集

时间:2014-04-20 10:08:06

标签: java algorithm

partition problem我已经理解了伪多项式时间算法。但是我无法打印平衡集。

我无法弄清楚在algo构造的表中存储什么而不是布尔值。

请提供algo打印分区子集。

您能提供解决方案,我可以修改构造的表来实现分区值。

1 个答案:

答案 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,它就是分区的一部分。否则,它不是分区的一部分。