|
| 1 | + #如何捅破python编程的那层纸之三 |
| 2 | + |
| 3 | + |
| 4 | +# coding:utf-8 |
| 5 | + |
| 6 | +""" |
| 7 | +如何捅破python编程的那层纸之三 |
| 8 | +贴吧上有人问 |
| 9 | +定义一个函数,名字为sameSums(aList),alist是一个整形list,函数作用是判断能分成两组,使得两组数字的和相等。若可以择返回值是true,若不可以返回值是false。如下例: |
| 10 | +sameSums([4, 7, 6, 3]) --> True //4+6 = 10 and 7 + 3 = 10 |
| 11 | +sameSums([3, 3]) --> True |
| 12 | +sameSums([4, 12, 16]) --> True //4+12= 16 and 16 |
| 13 | +sameSums([5, 1]) --> False |
| 14 | +这个题目,对初学者来说,有点难度,但稍微有点算法基础,编程思路,就不难。 |
| 15 | +前面用贪心算法,只能满足上面4个测试用例的正确解决。 |
| 16 | +如何捅破python编程的那层纸之二 |
| 17 | +https://github.com/pythonpeixun/article/blob/master/pythonstudy2.md |
| 18 | +但是对[4, 5, 6, 7, 8],[2, 2, 2, 3, 3]这样的list,不能解答出正确的答案。 |
| 19 | +这个问题:可以用递归解题,也可以用动态规划解题,黄哥用这样的思路解一下,供初学者参考! |
| 20 | +解题思路: |
| 21 | + 1、如果sum(list) 是奇数,就不能将list拆分为2个和相等的list |
| 22 | + 2、如果sum(list)之和为偶数,就 sub_sum = sum(list)/2 |
| 23 | + 2、列出所有可能的子集(子list) |
| 24 | + 3、判断子集是不是和 sub_sum相等,如果相等则可以拆分为2个和相等的list, |
| 25 | + 否则不可以 |
| 26 | +本文由黄哥python培训,黄哥所写 |
| 27 | +黄哥python培训试看视频播放地址 |
| 28 | +https://github.com/pythonpeixun/article/blob/master/python_shiping.md |
| 29 | + |
| 30 | +""" |
| 31 | +import itertools |
| 32 | + |
| 33 | + |
| 34 | +def get_all_subset(lst): |
| 35 | + """求list 所有子集合""" |
| 36 | + tmp_lst = [] |
| 37 | + length = len(lst) |
| 38 | + |
| 39 | + for i in xrange(1, length): |
| 40 | + tmp_lst += (set(itertools.combinations(lst, i))) |
| 41 | + return tmp_lst |
| 42 | + |
| 43 | + |
| 44 | +def sameSums(int_list): |
| 45 | + """黄哥python培训 黄哥所写 qq:1465376564 |
| 46 | + |
| 47 | + >>> sameSums([4, 7, 6, 3]) |
| 48 | + True |
| 49 | + >>> sameSums([3, 3]) |
| 50 | + True |
| 51 | + >>> sameSums([4, 12, 16]) |
| 52 | + True |
| 53 | + >>> sameSums([5, 1]) |
| 54 | + False |
| 55 | + """ |
| 56 | + sum_of_lsit = sum(int_list) |
| 57 | + sub_sum = sum_of_lsit / 2 |
| 58 | + if sum_of_lsit % 2: |
| 59 | + return False |
| 60 | + all_subset = get_all_subset(int_list) |
| 61 | + for item in all_subset: |
| 62 | + if sum(item) == sub_sum: |
| 63 | + return True |
| 64 | + return False |
| 65 | + |
| 66 | +if __name__ == "__main__": |
| 67 | + import doctest |
| 68 | + doctest.testmod() |
| 69 | + lst1 = [3, 9, 10, 30, 8] |
| 70 | + lst2 = [4, 5, 6, 7, 8] |
| 71 | + lst3 = [2, 2, 2, 3, 3] |
| 72 | + print sameSums(lst1) |
| 73 | + print sameSums(lst2) |
| 74 | + print sameSums(lst3) |
| 75 | + |
| 76 | + |
| 77 | + |
| 78 | + |
| 79 | + |
| 80 | +[迪艾姆python培训_python编程思路- ] |
| 81 | +(http://v.youku.com/v_show/id_XNTY0MDA5MDMy.html) |
| 82 | + |
| 83 | +[迪艾姆python培训_python编程思路二 ] |
| 84 | +(http://v.youku.com/v_show/id_XNTY0MDE1NzA0.html) |
| 85 | + |
| 86 | +[python爬虫之采集搜素引擎联想词 ] |
| 87 | +(http://www.tudou.com/programs/view/SXgshk-sYbw/) |
| 88 | + |
| 89 | + |
| 90 | +[广告:如果自学有困难,建议参加迪艾姆python培训,可以节省学习成本。](https://github.com/pythonpeixun/article/blob/master/index.md) |
0 commit comments