算法 – 减少多项式包装的子集和

这是一项家庭作业,所以任何帮助都表示赞赏.

我应该证明以下问题是NP完全的.提示说你应该减少这个问题的子集和问题.

Given a set of shapes, like the below, and an m-by-n board, decide whether is it possible to cover the board fully with all the shapes. Note that the shapes may not rotate.

For example, for a 3-by-5 board and the following pieces, the board can be covered like this:

《算法 – 减少多项式包装的子集和》

《算法 – 减少多项式包装的子集和》

现在需要注意的重要一点是,我们试图减少的子集和问题应该以m和n的形式给出输入长度多项式.

任何关于使用另一个NP完全问题的想法都值得赞赏.

最佳答案 我建议分两步进行这种减少.

首先,将subset-sum减少到partition problem.这个问题与subset-sum有关,除了不是给定目标k,目标是将集合分成两个完全相等的一半.这不是太难(我会把它作为练习)并使下一部分变得更容易.

接下来,将分区问题减少到平铺问题.直觉上,这个想法如下.如果分区问题中的输入数字是n1,n2,…,nk,则创建大小为3n1×1,3n2×1,…和3nk×1的区块,其中w是我们将选择的某个数字后来.然后,如果输入集中的数字之和为2N(意味着目标是将集合分成两个子集,每个子​​集总计为N),则创建一个3N×2板.

直觉是,如果我们可以将集合分成两个等和子集,那么我们可以通过从前半部分中取出所有数字来平铺该板,选择那些块,然后将它们端到端地铺设以形成3N× 1个矩形.然后我们可以从剩下的一半中取出数字并使用它们来形成一个3N×1矩形,因此将第一行瓷砖放在顶行,第二行瓷砖放在第二行中完全平铺电路板.

为了表明另一个方向有效,首先要注意的是瓷砖的尺寸至少为3×1,所以它们必须从左到右.因此,如果我们可以平铺电路板,我们已经找到了将瓷砖分成宽度相等的两组的方法,因此有一些方法可以将该组分成两个相等的和.

总的来说,输入的大小最多只增加一个多项式(我们将每个数字的大小增加三倍,每个输入数字长度最多增加两位),并且电路板的大小与输入一样大.因此,总的来说,减少只需要多项式时间来评估.

希望这可以帮助!

点赞