Python|算法在程序设计中的作用——以百钱买百鸡为例

算法 + 数据结构 = 程序

好的程序取决于好的算法和优良的数据结构,因此在程序设计的过程中不仅需要考虑时间复杂度,而且需要考虑空间复杂度,即就是节约计算所需时间成本的同时,占用较少的内存资源。本文将以一个简单的例子来说明算法在程序设计的过程中所发挥的重要作用。

问题描述:

一个人只有100元钱,需要在花光所有钱的情况下购买公鸡、母鸡和小鸡共一百只(百钱买百鸡)。已知公鸡每只3元,母鸡每只1元,小鸡每只0.5元,请编写python程序求出共有几种购买方案以及每种方案下公鸡、母鸡和小鸡各几只。(要求购买的一百只鸡里面必须同时具有公鸡、母鸡和小鸡)

1 分析问题

首先分析单纯购买每种鸡,分别能够买多少只:
公鸡:100 / 3 ≈ 33(只)
母鸡:100 / 1 = 100(只)
小鸡:100 / 0.5 = 200(只)
既然是利用python编程,则可以借用计算机本身强大的计算能力进行循环遍历操作,尝试每一种可能的情况,直到满足条件后对可行的结果进行输出。

2 解决问题

2.1 在此附上python代码
# 三层循环
num = 1         # 用于计算有多少种方案
count = 0       # 用于计算循环的次数
for gj in range(1,34):
    for mj in range(1,101):
        for xj in range(1,201):
            count += 1
            if gj + mj + xj == 100 and 3*gj + mj + 0.5*xj ==100:
                print(f'公鸡{gj}只,母鸡{mj}只,小鸡{xj}只,花费{3*gj + mj + 0.5*xj}')
                num += 1
print(num)
print(count)
2.2 输出结果与结果分析
# 输出结果
公鸡1只,母鸡95只,小鸡4只,花费100.0
公鸡2只,母鸡90只,小鸡8只,花费100.0
公鸡3只,母鸡85只,小鸡12只,花费100.0
公鸡4只,母鸡80只,小鸡16只,花费100.0
公鸡5只,母鸡75只,小鸡20只,花费100.0
公鸡6只,母鸡70只,小鸡24只,花费100.0
公鸡7只,母鸡65只,小鸡28只,花费100.0
公鸡8只,母鸡60只,小鸡32只,花费100.0
公鸡9只,母鸡55只,小鸡36只,花费100.0
公鸡10只,母鸡50只,小鸡40只,花费100.0
公鸡11只,母鸡45只,小鸡44只,花费100.0
公鸡12只,母鸡40只,小鸡48只,花费100.0
公鸡13只,母鸡35只,小鸡52只,花费100.0
公鸡14只,母鸡30只,小鸡56只,花费100.0
公鸡15只,母鸡25只,小鸡60只,花费100.0
公鸡16只,母鸡20只,小鸡64只,花费100.0
公鸡17只,母鸡15只,小鸡68只,花费100.0
公鸡18只,母鸡10只,小鸡72只,花费100.0
公鸡19只,母鸡5只,小鸡76只,花费100.0
20
660000

Amazing! 所有20种结果一目了然,计算机果然强大!
不过66000的计算量放在谁的身上都将是不可承受之重啊!那有没有给计算机减负的方法呢?

3 算法优化

较多的循环次数是首先要解决的问题,因此可行的方法是努力减少计算时循环的次数。通过分析上面的程序,结合题目的要求,我们发现当购买的鸡在总的数量为100的要求下,循环第一、二层循环之后,第三种鸡的数量可以直接通过三者的定量关系求出来。因此我们依据该思路对程序进行优化:

3.1 第一次优化
num = 1
count = 0
for gj in range(1,33):
    for mj in range(1,100):
        xj = 100-gj-mj          # 已知公鸡和母鸡的数量,小鸡的数量便可以直接求出来
        count += 1
        if gj + mj + xj == 100 and 3*gj + mj + 0.5*xj ==100:
            print(f'公鸡{gj}只,母鸡{mj}只,小鸡{xj}只,花费{3*gj + mj + 0.5*xj}')
            num += 1
print(num)
print(count)
# 输出结果
公鸡1只,母鸡95只,小鸡4只,花费100.0
公鸡2只,母鸡90只,小鸡8只,花费100.0
公鸡3只,母鸡85只,小鸡12只,花费100.0
公鸡4只,母鸡80只,小鸡16只,花费100.0
公鸡5只,母鸡75只,小鸡20只,花费100.0
公鸡6只,母鸡70只,小鸡24只,花费100.0
公鸡7只,母鸡65只,小鸡28只,花费100.0
公鸡8只,母鸡60只,小鸡32只,花费100.0
公鸡9只,母鸡55只,小鸡36只,花费100.0
公鸡10只,母鸡50只,小鸡40只,花费100.0
公鸡11只,母鸡45只,小鸡44只,花费100.0
公鸡12只,母鸡40只,小鸡48只,花费100.0
公鸡13只,母鸡35只,小鸡52只,花费100.0
公鸡14只,母鸡30只,小鸡56只,花费100.0
公鸡15只,母鸡25只,小鸡60只,花费100.0
公鸡16只,母鸡20只,小鸡64只,花费100.0
公鸡17只,母鸡15只,小鸡68只,花费100.0
公鸡18只,母鸡10只,小鸡72只,花费100.0
公鸡19只,母鸡5只,小鸡76只,花费100.0
20
3267

果然不出所料,循环次数由原来的66000次下降到了3267次,计算机听了都想夸我长得好看。虽然3267次的运算量对计算机来说就是小case。
但是对我们这些凡人来说依旧是不可承受之重啊!那有没有更为简单的方法,让我等凡人也可以欣然接受?

3.2 第2次优化

结合我们初中时候学习的数学知识,考试的时候遇到这种问题肯定要先设未知数,联立方程组,先拿点卷面过程分,至于方程有没有具体的解,能不能解出来之后再说!
因此,我们设公鸡、母鸡和小鸡的数量分别为x,y,z只,因此结合已知的等式和不等式关系,得到的方程组为:

x + y + z = 100(只)
3x + y + 0.5z = 100(元)
0< x ≤ 33,0 < y < 100, 0 < z < 200
先求解等式方程,得到变量之间的关系为:y=100-5x,z=4x,x=x(x,y,z都大于0)

# 代码实现
公鸡1只,母鸡95只,小鸡4只
公鸡2只,母鸡90只,小鸡8只
公鸡3只,母鸡85只,小鸡12只
公鸡4只,母鸡80只,小鸡16只
公鸡5只,母鸡75只,小鸡20只
公鸡6只,母鸡70只,小鸡24只
公鸡7只,母鸡65只,小鸡28只
公鸡8只,母鸡60只,小鸡32只
公鸡9只,母鸡55只,小鸡36只
公鸡10只,母鸡50只,小鸡40只
公鸡11只,母鸡45只,小鸡44只
公鸡12只,母鸡40只,小鸡48只
公鸡13只,母鸡35只,小鸡52只
公鸡14只,母鸡30只,小鸡56只
公鸡15只,母鸡25只,小鸡60只
公鸡16只,母鸡20只,小鸡64只
公鸡17只,母鸡15只,小鸡68只
公鸡18只,母鸡10只,小鸡72只
公鸡19只,母鸡5只,小鸡76只
20
19

Unbelievable! 计算量瞬间降到了 19 次,貌似是常人能理解的计算量了。看来初中学习的求解方程组的知识完胜计算机的简单暴力。
大喊一声:初中大法好!

总结

实现目的千千万,吾独钟情于走走捷径!初中大法好,好在计算方法使多变量成单一变量。计算机能力属实强,合理应用是关键,正所谓:"他强任他强,明月照大江。"
好算法,你可愿意成为我心中的那一轮月光?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343