前言
本文介绍了最简单的NP-hard问题——数字分区问题,以及该问题的一个伪多项式解法和两个近似解法。
数字分区问题
讨论这样一个问题:给定一个正整数的多重集合 ,能否将
划分为两个子集
和
,使得
中元素的和与
中元素的和相等?在数论和计算机科学中,该问题被称为是数字分区问题,尽管NP完全,但是却存在动态规划的解法能够在伪多项式时间内求解,并且在许多情况下,存在最佳或者是近似的解决方法。因此,这个问题也被称为"最简单的NP-hard问题"。
比如给定多重集合存在子集
和
,这两个子集划分了
。这个解并不是唯一的。
和
是另外一组解。
并不是所有的多重集合都能找到这个问题的解,比如。
伪多项式时间算法
在多重集合元素的个数和多重集合元素的和值不是很大时,可以采用动态规划来解决。
假设问题的输入是具有个正整数的多重集合
设为
中元素的和值
。那么算法就是找出一个
的子集,其和为
。如果这样的子集存在,那么:
如果
是偶数,
中其余元素的和也是
如果
是奇数,
中其余元素的和是
,我们将会得到一个近似解。