Source From Here
題目:
有兩個序列 a, b,大小都為 n,序列元素的值任意整形數,無序;要求:通過交換 a,b 中的元素,使 [序列 a 元素的和] 與 [序列 b 元素的和] 之間的差最小。
方法:
可能之一的演算法如下:
考慮已經 a, b 排序過後的結果存放於序列 c, 將其元素一一分配到 d, e 序列使其兩個序列的合的差值為最小:
範例代碼如下:
執行結果如下:
題目:
有兩個序列 a, b,大小都為 n,序列元素的值任意整形數,無序;要求:通過交換 a,b 中的元素,使 [序列 a 元素的和] 與 [序列 b 元素的和] 之間的差最小。
方法:
可能之一的演算法如下:
考慮已經 a, b 排序過後的結果存放於序列 c, 將其元素一一分配到 d, e 序列使其兩個序列的合的差值為最小:
範例代碼如下:
- #!/usr/bin/env python
- tests = [[1,2,3,4,5,6,700,800],
- [10001,10000,100,90,50,1],
- range(1, 11),
- [12312, 12311, 232, 210, 30, 29, 3, 2, 1, 1]]
- for c in tests:
- c.sort()
- a = []
- b = []
- # Approach 1
- #for i in range(len(c)/2):
- # if (i%2) == 0:
- # a.append(c[i*2])
- # b.append(c[i*2+1])
- # else:
- # b.append(c[i*2])
- # a.append(c[i*2+1])
- # Approach 2
- for i in range(len(c)/2):
- a_sum = reduce(lambda x,y:x+y, a, 0)
- b_sum = reduce(lambda x,y:x+y, b, 0)
- if a_sum > b_sum:
- a.append(c[i*2])
- b.append(c[i*2+1])
- else:
- b.append(c[i*2])
- a.append(c[i*2+1])
- print("C= %s" % c)
- print("A= %s" % a)
- print("B= %s" % b)
- a_sum = reduce(lambda x,y:x+y, a)
- b_sum = reduce(lambda x,y:x+y, b)
- print("A sum to %d; B sum to %d; Diff=%d" % (a_sum, b_sum, abs(a_sum-b_sum)))
This message was edited 5 times. Last update was at 28/12/2015 10:23:41
沒有留言:
張貼留言