一道python題

有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;

要求:通过交换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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值