- 论坛徽章:
- 0
|
本帖最后由 Hadron74 于 2012-09-12 19:11 编辑
回复 1# zp307300084
这个疑似是我以前贴的一个程序,呵呵!
现在我有了一个更好的方法,用0-1背包问题来解决这个问题。思路是,给一个总和长的select数组,记录a/b的状态,True表示在a中,False表示在b中。
用递归遍历所有选取n个元素在a中的可能,就遍历了所有可能的交换。这个算法的复杂度小于O(2^(2n)).
其算法可以参考http://www.cnblogs.com/Myhsg/archive/2009/08/29/1556460.html
下面是代码- def minus():
- global total,select,number
- a = [ total[i] for i in range(number) if select[i] ]
- b = [ total[i] for i in range(number) if not select[i] ]
- return abs(sum(a) - sum(b)),a,b
- def func(sumN,k):
- global select,number,halfnumber,minSN,an,bn
- if k==number:
- return
- if sumN == halfnumber:
- mi,am,bm = minus()
- if mi< minSN:
- minSN = mi
- an,bn = am,bm
- return
- select[k] = True
- func(sumN+1,k+1)
- select[k] = False
- func(sumN,k+1)
-
- if __name__ == '__main__':
- a = [1,2,3,4]
- b = [6,7,8,9]
- total = a + b
- an, bn = a[:], b[:]
- minSN = abs(sum(a)-sum(b))
- number = len(total)
- halfnumber = number/2
- select = map(lambda x: False,total)
- func(0,0)
- print minSN
- print an
- print bn
复制代码 结果:- 0
- [1, 4, 7, 8]
- [2, 3, 6, 9]
复制代码 |
|