我想出了一个有趣的问题,但找不到解决办法。这个np可能是完全的吗(像其他一些包装问题一样)?如果是的话,减价幅度会如何?
我们得到一个数组1..n,其中一些元素被占用,并且
段的长度。问题是,我们能把这些片段打包成
这个数组使得没有段相互重叠和占用的元素?
例如,数组:x(x-占用,下划线表示它是空闲的)和长度:3、3、4。在这种情况下,答案是肯定的,因为实际上这个数组中有两个容器:4、6,我们可以将容器中的前两个段(容量为6)打包,最后一个段打包到第一个容器。
最佳答案
让我们试着用partition-problem作为基本问题来描述约化。
分区问题
分割问题的任务是决定一个给定的多个正整数集是否可以被分割成两个子集s1和s2,使得s1中的数之和等于s2中的数之和。(来自上面的wiki链接)。
例子:
给定S={3,1,1,2,2,1}
分区问题的有效解决方案是两个集S1={1,1,1,2}和S2={2,3}
两者都将sum设置为5,并且它们对s进行分区。
减少
给定:一个分区问题实例,如S={3,1,1,2,2,1}
求和:n=和(x)
创建数组|+++…x***…|,其中|+|=n/2;|*|=n/2(基数)
|+++++x****(间隙作为类拆分)
添加与整数大小相等的段
段={####,#,#,#,##,#,##,#}
用上述问题的某种算法来解决这个问题
有效解决方案:|###############|(仅为可视化引入空白)
这种简化在多项式时间内是可行的(很明显,原始问题是NP问题)这意味着,原问题是NP完全问题。
关于arrays - 段打包算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38974710/