我需要在使用动态编程伪多项式时间算法解决分区问题后找到最佳子集。
更具体地说,我无法理解这个答案:https://stackoverflow.com/a/890243/1317826
我无法理解如何从布尔表中构造最佳子集。
关于分区问题的维基百科文章也有:http://en.wikipedia.org/wiki/Partition_problem
有人可以对此有所了解吗?
答案 0 :(得分:1)
您需要的一切都在您发布的答案中。
首先,当您使用伪多项式时间算法创建表时,不存储布尔值值(如果可达,则为True,否则为False),但是您添加到的元素的值子集。比你应该能够通过简单地从你获得的总和中减去它来构造子集。
所以算法是:
对于集合中的每个号码x_i
:
设置p(1, x_i) = x_i
对于其他所有字段p(row, sum)
,如果x_i
p(row-1, sum-x_i) != 0
所以现在p(row, sum) = x
意味着我们可以通过获取集合中的sum
个元素来获取row
,其中最后一个元素为x
。
一旦p(some_row, N/2) != 0
,你可以通过取其值x
来构建子集,然后转移到p(some_row - 1, N/2 - x)
,依此类推。
希望这说清楚。
顺便说一句。有没有办法在答案中写乳胶?