常用算法--穷举法
Posted Python刷LeetCode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用算法--穷举法相关的知识,希望对你有一定的参考价值。
18
5-2019
人生的旅途何如?
Read:人生之路,总是蜿蜒且曲折的烦恼,不安和疲倦总是一路,伴随着着我们...
算法是解决问题的重要手段,通过对问题的研究和分析,设计算法对问题进行求解,提高分析问题和解决问题的能力。经常采用的算法设计技术主要有迭代法、穷举法、贪心法、动态规划、分治法、回溯法等
穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。
下面我们借用几个例题来更加深入的学习一下穷举法。
传统的鸡兔同笼问题就可以用穷举法来解决。问题描述如下:鸡兔同笼,共有98个头,386只脚,请问鸡、兔各有几只?
我们用穷举法的思想来思考,我们考虑最多有多少只鸡,最多有多少只兔。我们发现鸡的取值为0-98,共有99种情况,兔的取值为0-96,共有97种情况,所以穷举所有可能的情况,共有99*97种情况
我们设鸡的个数为x个,兔的个数为y个,x和y的取值只需满足x+y=98,2*x+4*y=386则x和y就是我们所要的取值
for x in range(99):
for y in range(97):
if x+y == 98 and 2*x+4*y==386:
print('%d,%d' % (x,y))
另外一个相似的问题是搬砖问题,可以与鸡兔同笼问题一样使用穷举法来解决。问题描述如下:36块砖 36个人搬 。男搬4 女搬3 两个小儿抬一砖。 要求一次性搬完 问:男、女、小儿各几人?
根据穷举法的思想,男人的取值为0-9,共有10种情况,女人的取值为0-12,共有13种情况,小儿的取值为0-36(但需为偶数)共有19种情况。
我们设男人x,女人y,小儿z,需满足:x+y+z=36以及4x+3y+z/2=36 只需要求解方程的xyz即可
for x in range(10):
for y in range(13):
for z in range(0,37,2):
if (x+y+z)==36 and (4*x+3*y+z/2)==36:
print('%d,%d,%d' % (x,y,z))
我们在这里讨论一下背包问题,关于背包问题有很多的解法,我们在这里使用穷举法来求解一下背包问题。背包问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。我们可以具体定义为给定n个物品质量为{w1,w2,...,wn},相对应的价值为{v1,v2,...,vn},我们拥有一个背包,背包的容量为C,求使总价值最高的选择。
我们对每一件物品的选择只有两种情况,装入或者不装入,不能将一个物品装入背包多次,也不能将物品的部分装入,那么我们最多有2^n中情况,我们的每一种解决方案设为{x1,x2,...,xn} ,Xi=1表示第i个物品放入背包中, Xi=0表述第i个物品不放入背包。
我们只要找到满足总重量小于C,总价值最高的解决方案即可。
n = 3
result = ['']
for i in range(n):
temp1 = [x+'1' for x in result]
temp2 = [x+'0' for x in result]
result = temp1+temp2
result = [list(x) for x in result]
def find_max_value(X:list,w:list,v:list,c:float):
'''
retype: list,int
'''
max_value = 0
for x in X:
temp_w = 0
temp_v = 0
for i in range(len(x)):
#若xi==1 则表示将该物品装入背包
if x[i] == '1':
temp_w += w[i]
temp_v += v[i]
if temp_w<=c and temp_v>max_value:
temp_choice = x
max_value = temp_v
return temp_choice,max_value
talk is cheap, show me the code...
·end·
GitHub:https://github.com/wanghaoying/leetcode/blob/master/algorithm/%E7%A9%B7%E4%B8%BE%E6%B3%95.ipynb
以上是关于常用算法--穷举法的主要内容,如果未能解决你的问题,请参考以下文章
六中常用算法设计:穷举法分治法动态规划贪心法回溯法和分支限界法