Arrays 分段打包算法

Arrays 分段打包算法,arrays,algorithm,Arrays,Algorithm,我提出了一个有趣的(我认为)问题,但找不到解决办法。这是NP完全问题吗(像其他一些包装问题一样)?如果是的话,减价将如何进行 我们得到了一个数组1..n,其中一些元素被占用,并列出了 段的长度。问题是,我们能把这些部分打包成 这个数组,以便没有段相互重叠和占用的元素 例如,数组:| _____| x __|(x-占位,下划线表示它是自由的)和长度:3,3,4。在这种情况下,答案是肯定的,因为事实上我们在这个数组中有两个容器:4,6,我们可以将前两个段打包到容量为6的容器中,最后一个段打包到第一个

我提出了一个有趣的(我认为)问题,但找不到解决办法。这是NP完全问题吗(像其他一些包装问题一样)?如果是的话,减价将如何进行

我们得到了一个数组1..n,其中一些元素被占用,并列出了 段的长度。问题是,我们能把这些部分打包成 这个数组,以便没有段相互重叠和占用的元素


例如,数组:| _____| x __|(x-占位,下划线表示它是自由的)和长度:3,3,4。在这种情况下,答案是肯定的,因为事实上我们在这个数组中有两个容器:4,6,我们可以将前两个段打包到容量为6的容器中,最后一个段打包到第一个容器中。

让我们试着用基本问题来表示约简

划分问题 划分问题的任务是确定给定的多个正整数集是否可以划分为两个子集S1和S2,从而使S1中的数字之和等于S2中的数字之和。(来自上面的wiki链接)

例如:

  • 给定S={3,1,1,2,2,1}
  • 分区问题的有效解决方案是两个集合S1={1,1,1,2}和S2={2,3}
  • 这两个集合的总和为5,它们划分为S
减少
  • 给定:一个分区问题实例,如S={3,1,1,2,2,1}
  • 求和值:n=求和(X)
  • 创建数组|++…x***…|,其中|++=n/2;|*|=n/2(基数)
    • |+++++x******|(间隙充当类拆分)
  • 添加等于整数大小的线段
    • 分段={###,#,#,#,#,#,#,#,
  • 用上述问题的某种算法来解决这个问题
    • 有效的解决方案:|##########|(引入空白仅用于可视化) 这种简化在多项式时间内是可行的(很明显,原来的问题是NP)。这意味着,原始问题是NP完全问题