接着昨天关于贪心算法的帖子,学习一下
-
代码:
#-*-coding:utf-8-*- import itertools def get_all_subset(lst): """求list 所有子集合""" tmp_lst = [] length = len(lst) for i in xrange(1, length):#通过for循环列出所有的子集合 tmp_lst += (set(itertools.combinations(lst, i))) return tmp_lst def sameSums(int_list): """ >>> sameSums([4, 7, 6, 3]) True >>> sameSums([3, 3]) True >>> sameSums([4, 12, 16]) True >>> sameSums([5, 1]) False """ sum_of_lsit = sum(int_list) sub_sum = sum_of_lsit / 2 if sum_of_lsit % 2:#如果sum(list) 是奇数,就不能将list拆分为2个和相等的list return False all_subset = get_all_subset(int_list) for item in all_subset: if sum(item) == sub_sum:#判断子集是不是和 sub_sum相等 return True #如果相等则可以拆分为2个和相等的list return False #否则不可以 if __name__ == "__main__": import doctest doctest.testmod() lst1 = [3, 9, 10, 30, 8] lst2 = [4, 5, 6, 7, 8] lst3 = [2, 2, 2, 3, 3] print sameSums(lst1) print sameSums(lst2) print sameSums(lst3)
学习点:
itertools用法:
-
这里主要简单介绍itertools模块的排列组合:
import itertools 有序排列:e.g., 4个数内选2个排列: print list(itertools.permutations([1,2,3,4],2)) #[(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)] 无序组合:e.g.,4个数内选2个: print list(itertools.combinations([1,2,3,4],2)) #[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
set()函数返回列表中不同的元素组成的集合(Python 集合不允许重复)
doctest模块参见Python测试之doctest模块
参考文章:如何捅破python编程的那层纸之三
结语:
坚持每天进步一点点…