续"如何捅破python编程的那层纸之三"

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

# coding:utf-8

import itertools

def sameSums1(int_list):
    if len(int_list) == 1:
        # 列表只有一个元素必不能等分两组
        return False
    sum_of_lsit = sum(int_list)
    halfsum = sum_of_lsit / 2
    if sum_of_lsit % 2:
        # 和为奇数不可等分
        return False
    int_list.sort(reverse=True)
    for i in xrange(1, len(int_list)/2 + 1):
        if sum(int_list[:i]) < halfsum:
            # 若最大的前N位之和不足半值就不必检测N位组合的各种方案了
            continue
        elif sum(int_list[:i]) == halfsum:
            # 若恰巧是半值就直接返回
            return tuple(int_list[:i])
        for subset in itertools.combinations(int_list, i):
            sumsub = sum(subset)
            if sumsub == halfsum:
                # 找到就结束
                return subset


if __name__ == "__main__":
    import doctest
    doctest.testmod()
    import time
    lst1 = [3, 9, 10, 30, 8]
    lst2 = [4, 5, 6, 7, 8]
    lst3 = [2, 2, 2, 3, 3]
    lst4 = [10, 9, 8, 6, 5, 3, 2, 1]
    lst5 = [74, 80, 40, 38, 80, 68, 58, 91, 65, 10, 75, 88, 47, 84, 30]
    lst6 = [97, 2, 87, 96, 24, 12, 98, 85, 99, 67, 49, 86, 65,
            80, 83, 28, 57, 68, 90, 2, 62, 93, 9, 23]
    lst7 = [93, 99, 86, 94, 36, 62, 4, 54, 88, 69, 64, 19, 21,
            30, 53, 24, 10, 7, 93, 46, 82, 78, 20, 45, 27, 91,
            72, 48, 90, 62, 57, 65, 49]

    t0 = time.time()
    print sameSums1(lst1)
    print sameSums1(lst2)
    print sameSums1(lst3)
    print sameSums1(lst4)
    print sameSums1(lst5)
    print sameSums1(lst6)
    print sameSums1(lst7)
    t1 = time.time()
    print t1 - t0