總的 解空間的大小 是
app
C(2n, n)/2 = 2n!/(n!*n!)/2排序
從2n個元素中取出n個元素的組合數目, 又因爲對稱性 , 因此除以2get
例如: 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 rreturn
當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 的狀況的約束條件