题目介绍:
我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,
用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。
题目分析:
类型: 多方程不定解问题类型,采用暴力破解法
基本思路:(1)建立问题的数学模型,确定问题的可能解的集合(可能解的空间)。
(2)逐一列出可能解集合中的元素,验证是否是问题的解。
优化方向:通过加强约束条件,缩小可能解的集合的规模。
解法一:
算法思路:
约束条件: x+y+z=100
5*x+3*y+1/3 * z =100
z%3=0
思路 : 三个for循环纯暴力
代码实现:
for x in range(0,20): for y in range(0,34): for z in range(0,100): if (15*x+9*y+z == 300 and x+y+z == 100 and z%3 == 0 ):#15*x+9*y+z == 300同时乘以了3倍 ans = [x,y,z] print(ans)
运行结果:
解法二:
算法思路:
先把z求出来,去掉一个for循环,将时间复杂度从O(n^3)将为O(n^2)
代码实现:
for x in range(0,20): for y in range(0,34): z = 100-x-y if(z%3 == 0 and 5*x+3*y+z/3 == 100 ): ans = [x,y,z] print (ans)
解法三:
算法思路:
根据上面那个思路解题,确定一个未知数就可以减少一个for遍历(用于对未知数的遍历) 根据消元法,使x+y+z=100和5x+3y+z/3=100消掉z,得14x+8y=200 ,然后利用得出来的式子确定y,就只需一个未知数(for遍历可以解决掉)了
代码实现:
x in range(0,20): y = (200-14*x)/8 z = 100-y-x if (15*x+9*y+z == 300 and x+y+z == 100 and z%3 == 0 and x >= 0 and y >= 0 and z >= 0 ): """ 如果条件判断式中不加入打印等于零得条件,会式答案中出现负数 """ ans = [x,y,z] print(ans)