常用算法--穷举法

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,总价值最高的解决方案即可。

#生成2^n种情况n = 3result = ['']for i in range(n): temp1 = [x+'1' for x in result] temp2 = [x+'0' for x in result] result = temp1+temp2result = [list(x) for x in result] #将str类型转换为list
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] #若总重量小于c 以及 temp_v大于 max_value 执行 if temp_w<=c and temp_v>max_value: temp_choice = x max_value = temp_v return temp_choice,max_value #总共外部要循环2^n 内部要计算总重量和总价值循环n 总的算法时间复杂度为O(n*2^n)

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

以上是关于常用算法--穷举法的主要内容,如果未能解决你的问题,请参考以下文章

1-5算法设计常用思想之穷举法

六中常用算法设计:穷举法分治法动态规划贪心法回溯法和分支限界法

六中常用算法设计:穷举法分治法动态规划贪心法回溯法和分支限界法

python_1_常用算法

《算法问题实战策略》-chaper7-穷举法

算法思维之穷举法