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

# coding:utf-8

"""

贴吧上有人问

定义一个函数,名字为sameSums(aList),alist是一个整形list,函数作用是判断能分成两组,使得两组数字的和相等。若可以择返回值是true,若不可以返回值是false。如下例:

sameSums([4, 7, 6, 3]) --> True //4+6 = 10 and 7 + 3 = 10

sameSums([3, 3]) --> True

sameSums([4, 12, 16]) --> True //4+12= 16 and 16

sameSums([5, 1]) --> False

这个题目,对初学者来说,有点难度,但稍微有点算法基础,编程思路,就不难。

前面用贪心算法,只能满足上面4个测试用例的正确解决。

如何捅破python编程的那层纸之二

https://github.com/pythonpeixun/article/blob/master/pythonstudy2.md

但是对[4, 5, 6, 7, 8],[2, 2, 2, 3, 3]这样的list,不能解答出正确的答案。

这个问题:可以用递归解题,也可以用动态规划解题,黄哥用这样的思路解一下,供初学者参考!

解题思路:

1、如果sum(list) 是奇数,就不能将list拆分为2个和相等的list

2、如果sum(list)之和为偶数,就 sub_sum = sum(list)/2

2、列出所有可能的子集(子list)

3、判断子集是不是和 sub_sum相等,如果相等则可以拆分为2个和相等的list,

否则不可以

本文由黄哥python培训,黄哥所写

黄哥python培训试看视频播放地址

https://github.com/pythonpeixun/article/blob/master/python_shiping.md

"""

import itertools

def get_all_subset(lst):

"""求list 所有子集合"""

tmp_lst = []

length = len(lst)

for i in xrange(1, length):

tmp_lst += (set(itertools.combinations(lst, i)))

return tmp_lst

def sameSums(int_list):

"""黄哥python培训 黄哥所写 qq:1465376564

>>> 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:

return False

all_subset = get_all_subset(int_list)

for item in all_subset:

if sum(item) == sub_sum:

return True

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)

时间: 2024-08-01 22:47:44

如何捅破python编程的那层纸之三的相关文章

如何捅破python编程的那层纸

如何捅破python编程的那层纸    一些朋友自学python过程中,发现书也能看懂,书上的玩具代码也能看懂,但为啥自己不能做习题,不能写代码解决问题,自己不能动手写代码? 原因是初学者没有学会计算思维.解决问题的方法.编程思路. 编程思路的养成需要一个过程的,在编码过程中思考,多动手敲代码. 有时候,想不明白的地方,有人稍微点破一下,那层纸就很容易破. 请看下面的例子. 编程思路一: 经常有人问,一个文本文件,要抽取多少行以后的文本. 相信记数循环,大家都看得懂,也会写.下面的代码就是利用记

如何捅破python编程的那层纸之二

# coding:utf-8 """ 贴吧上有人问 定义一个函数,名字为sameSums(aList),alist是一个整形list,函数作用是判断能分成两组,使得两组数字的和相等.若可以择返回值是true,若不可以返回值是false.如下例: sameSums([4, 7, 6, 3]) --> True //4+6 = 10 and 7 + 3 = 10 sameSums([3, 3]) --> True sameSums([4, 12, 16]) -->

Python:编程“八荣八耻”

以动手实践为荣,以只看不练为耻. 以打印日志为荣,以单步跟踪为耻. 以空白分隔为荣,以制表分隔为耻. 以单元测试为荣,以手工测试为耻. 以代码重用为荣,以复制粘贴为耻. 以多态应用为荣,以分支判断为耻. 以Pythonic为荣,以冗余拖沓为耻. 以总结思考为荣,以不求甚解为耻. 刚刚看到,不可尽信,也不可全部不信.理性看待. 1. "以动手实践为荣, 以只看不练为耻" 俺写一个程序时间通常是这么分配的. 70% 的时间用来寻找和阅读现有代码, 如果找到了, 就不用自己写了.如果不够用或

python编程之赋值和拷贝的区别概述及操作excel数据库(图)

python编程之赋值和拷贝的区别概述及操作excel数据库(图)一.赋值在Python中,对象的赋值就是简单的对象引用,这点和C++不同,如下所示:a = [1,2,"hello",['python', 'C++']] b = a在上述情况下,a和b是一样的,他们指向同一片内存,b不过是a的别名,是引用.我们可以使用bisa 去判断,返回True,表明他们地址相同,内容相同,也可以使用id()函数来查看两个列表的地址是否相同.赋值操作(包括对象作为参数.返回值)不会开辟新的内存空间,

python程序员常用英语词汇,不会英语想学python编程的(收藏)

很多小伙伴们都在问小编:"我不会英语,想学python编程,怎么办",相信这个问题困扰了太多太多想学习编程但是英文不好的小伙伴吧.那么小编告诉你,可以.小编整理了最最常用的词,需要全部的加Q君羊 八八三四四四一零六 在君羊文件里 其实小编的英语也不好,其实学习编程不用担心英语不好的,毕竟常用的单词就那么多,只要把常用的单词学会了,你的代码就一样可以写的6到飞起,编程和英语的关系其实非常的简单和纯粹. 下面小编就整理了一些常用的单词,小伙伴们可以在闲暇时间看看,翻开读一读,以后就不用担心

python编程技巧

python编程中常用的12种基础知识总结: 正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进制转换,Python调用系统命令或者脚本,Python 读写文件. 1.正则表达式替换目标: 将字符串line中的 overview.gif 替换成其他字符串 >>> line = '<IMG ALIGN="middle" SRC=\'#\'" /spa

《Python编程快速上手 让繁琐工作自动化》pdf

<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post"> <p><br></p><p>下载地址:<a target="_blank" href="https://page74.ctfile.co

Python编程和 Lua编程的比较

Python编程和 Lua编程的比较 2016.4.21 定义函数: python: def functionname( parameters ): "函数_文档字符串" function_suite return [expression] lua: --[[ function returning the max between two numbers --]] function max(num1, num2) if (num1 > num2) then result = num

python 编程实例 1

#python 100 例 1.py #题目:有 1.2.3.4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多 #少? a = {} c = 1 for i in range(1,5): for j in range(1,5): for k in range(1,5): if (i != j,i !=k ,j!= k): #                print (i,j,k) a[c]=(i,j,k) c = c + 1 print (a) #把结果输入到字典 a中,并用c记数