枚举法C语言三个马驮东西,【MagO第三期】经典枚举算法题:百钱买百鸡

原标题:【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

参考代码

eae5dd407b598ba53964f1b38efef89d.png

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

b18c7e26b5bf02ad384ad4ca0bf3be87.png

06

项目练习

通过上面两题,相信大家已经此类不定方程组枚举所有可能性(枚举算法)有了清楚的认识,对于类似题目,你能自己完成吗?橙子OJ上还有一个题目 “校门外的树”,也是枚举算法问题,赶紧试着完成吧!

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,…,L都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

尝试一下,自己解题吧:

https://oj.coding61.com/problem/NOIP-P-2005-2

还是没有思路?那么可以看一下讲解视频吧:返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值