在优化版本的分区问题中,我们希望将集合X
分区为不相交的子集A
和B
,使max(sum(A),sum(B))
最小化。建议使用近似算法wikipedia,但我无法理解为什么这个近似值是4/3。
答案 0 :(得分:2)
OPT >= sum(all)/2
考虑到贪婪算法给你一些答案,如S 1 和S 2 ,其中:
max(sum(S 1 ),sum(S 2 ))> 4/3 OPT
(不失一般性假设sum(S 1 )> sum(S 2 ))所以我们有:
总和(S 1 )> 4/3 OPT> = 2 sum(all)/ 3
所以:
总和(S 1 )> 4/3 OPT> = 2 sum(all)/ 3 so sum(S 1 )> 2 sum(all)/ 3
所以:
总和(S 1 )> 2总和(S 2 )
因此,当sum(S 1 )小于sum(S 2 )时,在算法的一个步骤中,你必须添加一个像A
这样的元素到S 1 然后你没有添加任何元素到S 1
所以A
必须大于和的最终状态(S 2 )(因为A + sum(S 1 )> 2 sum(S <子> 2 子>))
所以A
大于当前状态和(S 1 )(因为sum的当前状态(S 1 )&lt; sum的当前状态( S 2 )&lt;总和的最终状态(S 1 )&lt; A)
您的列表按降序排序,因此A
必须是排序列表中的第一个元素(最大元素)。所以你的 1 必须包含A
而且你有。
你也知道总和(OPT)&gt; = A因为它包含A或其他部分包含A但是sum(OPT)大于其他部分元素的总和所以
sum(OPT) > A
但你有:
A = sum(S 1 )&gt; 4/3和(OPT)&gt;总和(OPT)&gt;甲
这是一个矛盾:)