问题描述
读汉斯·凯勒(Hans Kellerer),乌尔里希·普弗西(Ulrich Pferschy)和戴维·皮辛格(David Pisinger)所著的《背包问题》(2004),关于子集和问题,我发现了这个定义(第4章):
给出一组 N = {1,...,n} 个具有正整数权重的 n 个项目 W1,...,Wn 和容量 c ,子集和问题(SSP)是要找到 N 的子集,以使相应的总重量最大 不超过容量 c 。
在2.1节中正式发现(抱歉,没有LaTeX支持)
寻找伪代码样本,我发现了这个wikipedia article,其中声明了一个完全不同的(尽管非正式的)定义:
给定一组整数(或多个整数),是否有一个非空子集 总数为零?
尽管它也说有几种等效的表达方式,但我不认为这一点和本书完全可以等同。
我在这里看着两个不同的问题,以为是一样的吗?我想念什么?
谢谢
解决方法
是的,这两个定义不相等。背包问题中的定义描述了优化问题。在这种情况下,这是一个NP-Hard问题。维基百科上的定义描述了存在问题。这是NP完成。
两个定义之间的一大区别是正确性的验证。
- 存在问题可以在线性时间内轻松验证。对解决方案求和,并检查其是否为0。
- 难以验证优化。计算得出的解决方案真的是最好的解决方案,还是有更好的解决方案?