我试图解决以下问题:
有B(允许B变化)包含整数的未指定大小的列表。从每个列表中选择一个数字,以便所有选择的总和正好是A.通过减少已知的NP完整子集和问题来证明此问题是NP完成的。
我在思考如何解决这个问题:第一个必须限制"通过仅使大小B的子集可接受的正常子集和问题,因此必须首先将公共子集问题减少到多项式时间中的固定大小子集问题。我不太确定如何做到这一点很难。
其次我认为你可以在集合的问题副本中创建所有列表(例如,如果集合是{1,2,3,4,5},所有列表将是{1,2,3 ,4,5}),以便每个列表选择代表集合中的数字。这种想法的问题在于,没有什么可以防止您选择两次相同的数字,而正常的子集求和问题只允许您使用相同的数字一次。我也不认为有一种方法来安排列表,这是不可能做到的。因此,我不确定自己的思维方式是否正确。也可以将子集和问题减少到允许多次选择相同的数字,但我不确定如何做到这一点。想法?
答案 0 :(得分:1)
让I={a_1,...,a_n}
成为子集总和的实例,让B
成为目标容量。如下所示,定义具有固定大小和数字可重用性的子集和的实例I'
。让A=B
成为目标数字,并定义n
列表l_1={0,a_1},...,l_n={0,a_n}
。给定I'
的解决方案为I
中的每个i
生成[1,...n]
的解决方案,选择0
(对应于不选择项a_i
}}或选择a_{i}
。