1. 程式人生 > >證明兩個集合的劃分最小絕對值差問題

證明兩個集合的劃分最小絕對值差問題

總的 解空間的大小 是

C(2n, n)/2  =  2n!/(n!*n!)/2

從2n個元素中取出n個元素的組合數目,  又由於對稱性 , 所以除以2

例如: 1234 ---》 取出兩個元素的組合:  12  13 14 23 24 34

分成兩個集合的可能性是: (12, 34), (13, 24), (14, 23)

生成組合的程式:

n = 4
p = range(0, n)
def get(seq, k):
    m = len(seq)
    print m, k
    if k == 0:
        return [[]]
    if m < k:
        return []
    res = []
    for i in get(seq[1:], k-1):
        res.append([seq[0]]+i)
    res += get(seq[1:], k)
    return res
r = get(p, n/2)
print r

當n=1 時候:唯一的解

當n=2時候: 可以元素按照 從小到大排序,  a1 <= a2 <= a3<= a4

那麼最優解決是: (a1,a4 )  (a2,a3)

證明如下:

(a1, a2) (a3, a4) 組合 的差值的絕對值最大, 因為對於任意的 2n個元素中取出n個元素,頭n個元素之和最小, 最後n個元素之和最大, 差值絕對值自然最大

又有如下

(a1, a3), (a2, a4) |a1-a2+a3-a4| = |a1-a2|+|a3-a4| >= |a1+a4-(a2+a3)|

所以(a1,a4), (a2,a3) 組合解最優

證明n=3 的情況的約束條件