45.贪心算法之一:阿里巴巴与四十大盗的故事

Posted 和孩子一起学Python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了45.贪心算法之一:阿里巴巴与四十大盗的故事相关的知识,希望对你有一定的参考价值。



    贪心算法一般都会用来作为入门的算法,因为它的思想最为简单,本篇通过阿里巴巴与四十大盗的故事引入第一个简单的例题。




    算法(Algorithm)是指解题方案的准确而完整的描述。

    算法是一个通用的概念,不仅局限于计算机算法,比如经典的算法:欧几里德算法,割圆术,秦九韶算法都是计算机发明之前的数学算法。

    通过Python语言,我们可以在计算机上通过各种算法解决复杂的问题。而最最重要的是,在这个过程中,理解通用的解决复杂问题的思路。


    

贪心算法


    贪心算法也叫贪婪算法


    贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案

《算法导论》

    

    一般来说,使用贪心思想来解决问题可以分3步走

    1.全局的问题是否可以分解成多步

    2.每一步是否可以做出“当前最好”的选择

    3.每一步做出“当前最好”选择之后,是否全局的选择也是最优的。


    比如小朋友可能都认为最大的苹果是最好吃的。

    家里买了很多苹果,但因为小朋友爱吃甜食,有轻微蛀牙,所以每天只允许吃一个,并且如果哪天发现他的蛀牙严重了就不允许他吃了。

    所以,小朋友挑苹果的最优策略是什么?

    第1天,挑最大的苹果

    第2天,挑剩下里最大的苹果

    ……


    这就是贪心的思想,人好像天生就具备这个思想。

    


阿里巴巴和四十大盗


    《阿里巴巴和四十大盗》,是世界著名民间故事,出自《一千零一夜》(《天方夜谭》)。讲的是穷小伙阿里巴巴牵着他的小毛驴在山里砍柴,无意中发现了40大盗把抢劫来的财报藏在一个山洞,并且听到了大盗们只要喊出“芝麻开门”就可以打开山洞大门的秘密。于是阿里巴巴就等大盗们走了之后,进山洞搬走了财宝分给穷人们的故事。


45.贪心算法之一:阿里巴巴与四十大盗的故事


    

    这一次,阿里巴巴偷偷进入山洞,发现山洞里摆满了古董。

    阿里巴巴不清楚每件古董的价值,所以他想用小毛驴驮走尽可能多数量的古董。

但小毛驴能驮动的重量是有限的,请问阿里巴巴应该用什么策略挑古董?


贪心算法实现


    虽然这个问题非常非常简单,但我们还是用“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万。


    假设阿里巴巴有足够多不计重量的口袋,可以用来装这些贵重金属,在小毛驴承重有限的情况下,阿里巴巴怎么选择才能拿走价值最多的宝物?



    往期文章 https://dwz.cn/gBg1UPmk
    或关注公众号,点“原创文章”






扫描二维码

获取更多精彩

少儿编程


以上是关于45.贪心算法之一:阿里巴巴与四十大盗的故事的主要内容,如果未能解决你的问题,请参考以下文章

《阿里巴巴与四十大盗》读后感500字

贪心算法 | 背包问题——阿里巴巴与四十大盗

贪心策略背包问题——阿里巴巴与四十大盗

贪心策略背包问题——阿里巴巴与四十大盗

《阿里巴巴和四十大盗》读后感

3星|《阿里巴巴与四十大道》:文艺范员工写的阿里故事集