原标题:【MagO第三期】经典枚举算法题:百钱买百鸡
01
历史故事
张邱建提出的百钱买百鸡问题:
山东临清的数学家——张邱建,约公元5世纪著名的大数学家。他将毕生的精力投入到算学研究之中,为数学的不断发展和完善,做出了重大贡献。
《张邱建算经》卷下第三十八题。文曰:“今有鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一,凡百钱买鸡百只,问鸡翁、母、雏各几何?”在题中有三个未知数,却只有两个方程,为不定方程组。
张邱建对此题给出了三组答案:第一组:公鸡四、母鸡十八,小鸡七十八;第二组:公鸡八、母鸡十一,小鸡八十一;第三组:公鸡十二、母鸡四、小鸡八十四。
02
百钱买百鸡问题
公鸡每只5元,母鸡每只3元,三只小鸡1元,用100元买100只鸡,问公鸡、母鸡、小鸡各多少只?
题目答案应为四组解:
公鸡有0 母鸡有25 小鸡有75
公鸡有4 母鸡有18 小鸡有78
公鸡有8 母鸡有11 小鸡有81
公鸡有12 母鸡有4 小鸡有84
题目链接地址:
https://oj.coding61.com/problem/%E6%9E%9A%E4%B8%BE-20
03
思路分析
假设公鸡、母鸡、小鸡数量分别为mj,gj和xj。根据百钱买百鸡的规则可以得到如下不定方程组。
(1)gj+mj+xj=100
(2)5*gj+3*mj+1*xj=100
由于“百钱”是定值,所以 mj,gj和xj有取值范围。5*gj<=100 ,则0<=gj<=20; 同理 0<=mj<=33;那么xj=100-gj-mj。
先敲定一个变量的值,再利用另外两个值循环,通过计算机来枚举所有的可能结果,这种方法称为枚举算法。
04
参考代码
05
“计算马的数量”
“计算马的数量”,是我们橙子OJ上的一个题目,本质上就是百钱买百鸡问题。
100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担。试编写程序计算大、中、小马的数目。
与上题类似,这里也需要解决一个三元一次方程组的问题。假设分别用i,j,k代表大马、中马、小马的数量,则列出方程组并确定未知数的取值范围如下。
(1)i+j+k=100
(2)3i+2j+k=100
其中0<=i<=33; 0<=j<=50; k=100-i-j
题目链接地址:
https://oj.coding61.com/problem/%E5%BE%AA%E7%8E%AF%E7%BB%93%E6%9E%8415
06
项目练习
通过上面两题,相信大家已经此类不定方程组枚举所有可能性(枚举算法)有了清楚的认识,对于类似题目,你能自己完成吗?橙子OJ上还有一个题目 “校门外的树”,也是枚举算法问题,赶紧试着完成吧!
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,…,L都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
尝试一下,自己解题吧:
https://oj.coding61.com/problem/NOIP-P-2005-2