45.贪心算法之一:阿里巴巴与四十大盗的故事
Posted 和孩子一起学Python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了45.贪心算法之一:阿里巴巴与四十大盗的故事相关的知识,希望对你有一定的参考价值。
贪心算法一般都会用来作为入门的算法,因为它的思想最为简单,本篇通过阿里巴巴与四十大盗的故事引入第一个简单的例题。
算法(Algorithm)是指解题方案的准确而完整的描述。
算法是一个通用的概念,不仅局限于计算机算法,比如经典的算法:欧几里德算法,割圆术,秦九韶算法都是计算机发明之前的数学算法。
通过Python语言,我们可以在计算机上通过各种算法解决复杂的问题。而最最重要的是,在这个过程中,理解通用的解决复杂问题的思路。
贪心算法也叫贪婪算法。
贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案
《算法导论》
一般来说,使用贪心思想来解决问题可以分3步走
1.全局的问题是否可以分解成多步
2.每一步是否可以做出“当前最好”的选择
3.每一步做出“当前最好”选择之后,是否全局的选择也是最优的。
比如小朋友可能都认为最大的苹果是最好吃的。
家里买了很多苹果,但因为小朋友爱吃甜食,有轻微蛀牙,所以每天只允许吃一个,并且如果哪天发现他的蛀牙严重了就不允许他吃了。
所以,小朋友挑苹果的最优策略是什么?
第1天,挑最大的苹果
第2天,挑剩下里最大的苹果
……
这就是贪心的思想,人好像天生就具备这个思想。
阿里巴巴和四十大盗
《阿里巴巴和四十大盗》,是世界著名民间故事,出自《一千零一夜》(《天方夜谭》)。讲的是穷小伙阿里巴巴牵着他的小毛驴在山里砍柴,无意中发现了40大盗把抢劫来的财报藏在一个山洞,并且听到了大盗们只要喊出“芝麻开门”就可以打开山洞大门的秘密。于是阿里巴巴就等大盗们走了之后,进山洞搬走了财宝分给穷人们的故事。
这一次,阿里巴巴偷偷进入山洞,发现山洞里摆满了古董。
阿里巴巴不清楚每件古董的价值,所以他想用小毛驴驮走尽可能多数量的古董。
但小毛驴能驮动的重量是有限的,请问阿里巴巴应该用什么策略挑古董?
虽然这个问题非常非常简单,但我们还是用“3步法”来分析一下:
1.全局的问题是否可以分解成多步
阿里巴巴一件一件挑古董,就天然相当于把整个问题分解了多步。
2.每一步是否可以做出“当前最好”的选择
每一步最好的选择是什么?
显然是挑重量最小的古董。
3.每一步做出“当前最好”选择之后,是否全局的选择也是最优的。
每一步最优,是否全局也最优?
假设一共有n件古董,古董的集合 S = {a1,a2,a3,a4,……an},且集合里的古董是按重量从小到大排列的。
设小毛驴的承重量是 C
按贪心的思想去挑选古董,假设挑选了m件之后,装不下第m+1件了。
也即挑好的古董集合为 S' = {a1,a2,a3,a4,…… am}
可知, a1+a2+…… +am <= C
a1+ a2+……+am+am+1 >C
那有没有可能找到一个集合 S‘’ ,装下 m+1个古董,且古董重量之和小于C呢?肯定是不可能的。
代码的实现很简单。
就是把古董按重量从小到大排序,从小的开始挑,直到超出小毛驴的承重能力。
antiques = random.sample(range(1,100),10)
bearing = random.randint(30,80)
print(antiques)print(bearing)
antiques.sort()
print(antiques)
weight = 0
count = 0
for i in range(len(antiques)):
weight += antiques[i]
if weight <= bearing:
count += 1
else:
break
print(count)
这一次,阿里巴巴又偷偷溜进了山洞,发现山洞里摆满了各种箱子,每个箱子里装的都是各种沙状的贵重金属,且箱子上还贴了标签
金沙 20公斤,价值800万。
银沙 10公斤,价值2万。
铜沙 30公斤,价值1万。
xx 20公斤,价值400万。
xx 40公斤,价值1000万。
假设阿里巴巴有足够多不计重量的口袋,可以用来装这些贵重金属,在小毛驴承重有限的情况下,阿里巴巴怎么选择才能拿走价值最多的宝物?
扫描二维码
获取更多精彩
少儿编程
以上是关于45.贪心算法之一:阿里巴巴与四十大盗的故事的主要内容,如果未能解决你的问题,请参考以下文章