【问题标题】:Which algorithm can be used to solve this variation of the partition-prob?哪种算法可以用来解决分区概率的这种变化?
【发布时间】:2012-10-19 00:37:49
【问题描述】:

这就是问题所在:

您有两个长度相等的数组 A 和 B。您必须将它们分成两组 P 和 Q,这样: (1) 他们的差异被最小化。 (2) 如果 A[i] 进入 P 或 Q 中的一个,B[i] 应该进入另一个。

这里是实际问题的链接:http://opc.iarcs.org.in/index.php/problems/EQGIFTS

这是我的逻辑(解决实际问题):

如果输入是:a b c d e f g,值列表和索引 a,b,c,d,e,f 分别为 0,1,2,3,4,5

如果 t 是 a,b,c,d,e,f,g 的索引,程序会检查 t 和 i 这样 即:[t] 处的值 > [t-i] 处的值,从 t = 5 开始,并且 i = 1,并将 i 的值增加 1 并减小 t 的值 1.

一旦找到匹配项,它就会交换两个索引的值 并对从 [t-1] 开始的值进行排序。 结果值列表是输出。

我不知道这个算法有什么问题,但它对所有测试用例产生了错误的答案。 我知道它可以使用动态编程来解决,并且它是分区问题的一种变体。但是我不知道如何改变分区算法来解决这个问题。

【问题讨论】:

  • 您的问题陈述与链接中的问题陈述在两个方面不同(可能很重要,也可能不重要)。在原始问题中,数组元素是 (1) 正数和 (2) 以已知常数(单词问题中的 300)为界。您已经删除了这两个约束。但是,我不知道这是否会改变问题的固有复杂性。

标签: algorithm dynamic-programming partition-problem


【解决方案1】:

将问题简化为分区问题:
为每个i 创建第三个数组D[i] = B[i] - A[i]

现在问题是数组D上的一个经典partition problem,你可以使用它的DP解得到一个伪多项式时间解。

正确性证明:
如果D (sum(D_1) = sum(D_2)) 上有解决方案 - 那么i_1,...,i_k 被选为D_1j_1,...,j_m 被选为D_2(并且每个索引都在 i 或 j 中),例如那:

sum(D[i's]) = sum(D[j's])

从结构上来说,意思是:

sum(B[i]-A[i]) = sum(B[j]-A[j]) (for each relevant i's,j's)

因此:

sum(B[i's]) - sum(A[i's]) = sum (B[j's]) - sum(A[j's])

从这里:

sum(B[i's]) + sum(A[j's]) = sum(B[j's]) + sum(A[i's])

这正是我们想要的,因为每个“索引”都分配给两个部分,一个部分得到 B,另一个得到 A。
另一个方向类似。

QED


问题的复杂性:
问题仍然是简单归约的 NP-Hard:

给定一个分区问题的实例 (S=[a_1,a_2,...,a_n]),创建这个问题的实例:

A=S, B=[0,...,0]

很容易看出,对这个问题给出最优解的同一解将是原始分区问题所需的分区,因此该问题是 NP-Hard。

【讨论】:

    猜你喜欢
    • 2016-10-26
    • 2023-01-08
    • 2013-10-09
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2012-06-23
    • 2018-09-23
    • 2020-03-12
    相关资源
    最近更新 更多