PartitionProblem - 找到最佳子集

时间:2013-06-19 10:41:19

标签: algorithm dynamic-programming np-complete subset-sum partition-problem

我需要在使用动态编程伪多项式时间算法解决分区问题后找到最佳子集。

更具体地说,我无法理解这个答案:https://stackoverflow.com/a/890243/1317826

我无法理解如何从布尔表中构造最佳子集。

关于分区问题的维基百科文章也有:http://en.wikipedia.org/wiki/Partition_problem

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

您需要的一切都在您发布的答案中。

首先,当您使用伪多项式时间算法创建表时,不存储布尔值值(如果可达,则为True,否则为False),但是您添加到的元素的值子集。比你应该能够通过简单地从你获得的总和中减去它来构造子集。

所以算法是:

  1. 对于集合中的每个号码x_i

    1. 设置p(1, x_i) = x_i

    2. 对于其他所有字段p(row, sum),如果x_i

    3. ,则将其设置为p(row-1, sum-x_i) != 0
  2. 所以现在p(row, sum) = x意味着我们可以通过获取集合中的sum个元素来获取row,其中最后一个元素为x

  3. 一旦p(some_row, N/2) != 0,你可以通过取其值x来构建子集,然后转移到p(some_row - 1, N/2 - x),依此类推。

  4. 希望这说清楚。

    顺便说一句。有没有办法在答案中写乳胶?