有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
get_pwd是窮舉所有密碼組合的函數,
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
思路
c = a +b
half_c = sum(c)/2.0
窮舉c裡取len(a)的所有組合,再求合,再跟half_c比較求最出差最小的組合
#!/usr/bin/env python
def get_pwd(str, num):
if(num == 1):
return [x for x in str]
else:
return [ x+y for x in str for y in get_pwd(str[1:], num-1)]
def get_pwd2(str, num):
if(num == 1):
return [x for x in str]
else:
return [ str[x]+y for x in range(len(str)) for y in get_pwd2(str[x+1:], num-1)]
def f(x):
#print 'x=',x
if isinstance(x, int):
return [x]
else:
return x
def get_comp(str, num):
if(num == 1):
return [x for x in str]
else:
return [[str[x]]+f(y) for x in range(len(str)) for y in get_comp(str[x+1:], num-1)]
if __name__ == '__main__':
#aa = get_pwd2('123456789', 5)
#print aa
a = [1, 2, 3, 4, 5]
b = [60, 70, 80, 90, 101]
c = a + b
avg = sum(c)/2.0
print avg
c.sort()
dd = get_comp(c, 5)
ee = [(abs(sum(x)-avg), x) for x in dd]
ee.sort()
print ee
get_pwd是窮舉所有密碼組合的函數,
改了一下get_pwd2會去除重復元素,
get_comp是用作list