枚举法解决百元买百鸡精品课件

合集下载

枚举法解决百元买百鸡-文档资料18页PPT

枚举法解决百元买百鸡-文档资料18页PPT
Thank you
枚举法解决百元买百鸡-文档资料
56、极端的法规,就是极端的不公。 ——西 塞罗 57、法律一旦成为人们的需要,人们 就不再 配享受 自由了 。—— 毕达哥 拉斯 58、法公共 的利益 ;一部 分靠有 害的强 制,一 部分靠 榜样的 效力。 ——格 老秀斯 59、假如没有法律他们会更快乐的话 ,那么 法律作 为一件 无用之 物自己 就会消 灭。— —洛克
60、人民的幸福是至高无个的法。— —西塞 罗
6、最大的骄傲于最大的自卑都表示心灵的最软弱无力。——斯宾诺莎 7、自知之明是最难得的知识。——西班牙 8、勇气通往天堂,怯懦通往地狱。——塞内加 9、有时候读书是一种巧妙地避开思考的方法。——赫尔普斯 10、阅读一切好书如同和过去最杰出的人谈话。——笛卡儿

多种解法求百钱百鸡问题

多种解法求百钱百鸡问题

学号:0121210680225《算法设计与分析B》大作业题目多种解法求百钱百鸡问题学院计算机科学与技术学院专业软件工程班级Sy1201姓名李安福指导教师何九周2014 年12 月26 日多种解法求百钱百鸡问题摘要:中国古代数学家张丘建提出的“百钱买百鸡”可以采用蛮力法来解决。

本文给出了百钱百鸡问题的描述,采用蛮力法来解决这个问题,并通过分析对算法进行了优化,进一步提高了解决此问题的效率。

关键字:枚举,执行效率,蛮力法,不定方程,循环变量。

1引言蛮力法是一种简单直接地解决问题的方法,通常直接基于问题的描述和所涉及的概念定义。

这种方法经过很少的思考,把问题的所有情况或所有的过程交给计算机去一一尝试,从中找出问题的解。

由于计算机运算速度快,在解决问题时可采用这种“懒惰”的策略。

蛮力法的主要优点在于它是有广泛的适用性和简单性;它的缺点是大多数蛮力算法的效率都不高。

2问题概述 百钱百鸡问题:中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?3问题的分析题目分析与算法设计这是一个古典数学问题我们假设公鸡、母鸡和小鸡的个数分别为x,y,z,那么买公鸡的钱数为5x ,买母鸡的钱数为3y ,买小鸡的钱数为z/3;再由题意,x,y 和z 的和为100,问题化为可三元一次方程组,该问题的数学模型如下:⎩⎨⎧=++=++)(100)(1003/35百鸡百钱z y x z y x这里x,y,z 为正整数,且z 是3的倍数;由于鸡和钱的总数都是100,可以确定x,y,z 的取值范围:1) x 的取值范围为1~20 2) y 的取值范围为1~33 3) z 的取值范围为1~99对于这个问题我们可以用穷举的方法,遍历x,y,z 的所有可能组合,最后得到问题的解。

4算法设计 4.1算法设计14.1.1数据要求问题中的常量: 无无问题的输出:int x,y,z /*公鸡、母鸡、小鸡的只数*/4.1.2初始算法1.初始化为1(循环语句中初始值为1);2.计算x循环,找到公鸡的只数;3.计算y循环,找到母鸡的只数;4.计算z循环,找到小鸡的只数;5.结束,程序输出结果后退出。

2.4.2基于枚举算法的问题解决 精品教学设计 人教_中图版(2019) 高中信息技术必修1

2.4.2基于枚举算法的问题解决 精品教学设计 人教_中图版(2019) 高中信息技术必修1

课题2.4.2 基于枚举算法的问题解决教学过程图1 分析问题示例设计算法:根据问题分析,只要一一列举出4位数字AABB中A与B的所有可能组合,保证A≠B 且A≠0.再验证二次方问题,就可以得到同题的解。

因此,该问题可使用枚举算法求解完成用枚举算法实现解“票据中的数字”问题,如何进行问题拆解?○1本问题的已知条件是什么?求解目标是什么?隐含什么样的关系?➢一一列举可能的解,即枚举范围是多少?➢逐一检验可能的解,判断条件是什么?○2设计算法:输入数据、处理数据、输出结果逐一列举,用循环结构就可以解决。

一一校验,则需要用到分支结构,验证哪些情况满足问题的条件,如果满足就输出。

编程实现与调试:import mathfor A in range(1,10):for B in range(0,10):if A!=B: 学生体验枚举法解决问题的全过程学生通过该问题理解和掌握语句之间的逻辑关系,通过程序的缩进来体现逻辑关系观察与思考,完成算法流程图,总结枚举算法的基本原理。

观察程序,体会用计算机程序解决问题的优势。

k=A * 1000+A * 100+B * 10+Bc=int(math.sqrt(k))if c*c==k:print("票据编号是:",k)二、枚举算法枚举算法:依据问题的已知条件,确定答案的大致范围,在此范围内列举出它所有可能情况的方法。

枚举算法适合解决求解的答案数量有限,并且可能的答案是能按照某种规则列举出来的问题。

例如,用枚举法解决一些数学问题(“韩信点兵”“鸡兔同笼”等),益智游戏和逻辑推理等。

三、应用枚举算法解决问题1、-水仙花数“水仙花数”是指一个三位自然数,其各位数字的立方和等于该数本身。

例如153是“水仙花数”,因为:153 = 13 + 53 + 33。

已知条件: 一个三位自然数,其各位数字的立方和等于该数本身求解目标 : 求水仙花数已知与未知的关系 :要求解的这个数必须同时满足所有的已知条件。

枚举法

枚举法

枚举法,常常称之为穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。

能使命题成立者,即为问题的解。

采用枚举算法解题的基本思路:(1)确定枚举对象、枚举范围和判定条件;(2)一一枚举可能的解,验证是否是问题的解下面我们就从枚举算法的的优化、枚举对象的选择以及判定条件的确定,这三个方面来探讨如何用枚举法解题。

枚举算法应用例1:百钱买百鸡问题:有一个人有一百块钱,打算买一百只鸡。

到市场一看,大鸡三块钱一只,小鸡一块钱三只,不大不小的鸡两块钱一只。

现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡?算法分析:此题很显然是用枚举法,我们以三种鸡的个数为枚举对象(分别设为x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件,穷举各种鸡的个数。

下面是解这个百鸡问题的程序var x,y,z:integer;beginfor x:=0 to 100 dofor y:=0 to 100 dofor z:=0 to 100 do{枚举所有可能的解}if (x+y+z=100)and(x*3+y*2+z div 3=100)and(z mod 3=0)then writeln('x=',x,'y=',y,'z=',z); {验证可能的解,并输出符合题目要求的解} end.上面的条件还有优化的空间,三种鸡的和是固定的,我们只要枚举二种鸡(x,y),第三种鸡就可以根据约束条件求得(z=100-x-y),这样就缩小了枚举范围,请看下面的程序:var x,y,z:integer;beginfor x:=0 to 100 dofor y:=0 to 100-x dobeginz:=100-x-y;if (x*3+y*2+z div 3=100)and(z mod 3=0)thenwriteln('x=',x,'y=',y,'z=',z);end;end.未经优化的程序循环了1013次,时间复杂度为O(n3);优化后的程序只循环了(102*101/2)次,时间复杂度为O(n2)。

枚举法

枚举法

枚举法在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法.枚举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。

在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。

这两种类型经常(但不总是)重叠。

特点将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。

例如:找出1到100之间的素数。

需要将1到100之间的所有整数进行判断。

枚举算法因为要列举问题的所有可能的答案,所有它具备以下几个特点:1、得到的结果肯定是正确的;2、可能做了很多的无用功,浪费了宝贵的时间,效率低下。

3、通常会涉及到求极值(如最大,最小,最重等)。

4、数据量大的话,可能会造成时间崩溃。

结构枚举算法的一般结构:while循环。

首先考虑一个问题:将1到100之间的所有整数转换为二进制数表示。

算法一:for i:=1 to 100 do begin将i转换为二进制,采用不断除以2,余数即为转换为2进制以后的结果。

一直除商为0为止。

end;算法二:二进制加法,此时需要数组来帮忙。

program p;var a:array[1..100] of integer; {用于保存转换后的二进制结果} i,j,k:integer;beginfillchar(a,sizeof(a),0); {100个数组元素全部初始化为0}for i:=1 to 100 do begink:=100;while a[k]=1 do dec(k); {找高位第一个为0的位置}a[k]:=1; {找到了立刻赋值为1}for j:=k+1 to 100 do a[j]:=0; {它后面的低位全部赋值为0}k:=1;while a[k]=0 do inc(k); {从最高位开始找不为0的位置}write('(',i,')2=');for j:=k to 100 do write(a[j]); {输出转换以后的结果}writeln;end;end.枚举法,常常称之为穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。

百钱百鸡问题

百钱百鸡问题

百鸡问题
公元5世纪末,我国古代数学家张丘建在他所撰写的《算经》中,提出了这样的一个问题:“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一.百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?”意思是公鸡5元一只,母鸡3元一只,小鸡1元三只。

用100元100只鸡,求公鸡、母鸡、小鸡各买几只。

假设a 为公鸡只数,b 为母鸡只数,c 为小鸡只数,如果把问题转化为n 元钱买n 只鸡,针对上述问题n =100,根据题意可得出下面的约束方程:
53/3%30
a b c n
a b c n c ++=++==
用穷举法实现如下所示:
图4.3 穷举法求解百鸡问题
这个算法有三重循环,枚举公鸡数量的外循环,枚举母鸡数量的中间循环以及枚举小鸡数量的内循环,主要执行时间取决于内循环的循环体的执行次数,需要执行(n+1)3次,当n=100时,内循环需要执行大于100万次。

考虑到n元钱只能买到n/5只公鸡或n/3只母鸡,因此有些组合可以不必考虑,而小鸡的数目又取决于公鸡和母鸡的只数,上述的内循环可以省去。

图4.3 改进算法求解百鸡问题
改进算法只有两层循环,枚举公鸡数量的外循环和枚举母鸡数量的内循环,内循环的执行次数为(n/5+1) (n/3+1)。

当n=100时,内循环执行21*34=714次,这和穷举算法的100万次相比,仅为原来的万分之七,有重大改进。

算法:枚举法

算法:枚举法
}
} if(mark){ //是素数进行输出
cout<<" "<<i;
}
}
枚举法
例题:找出1到100之间的素数。
程序优化后如右图。
优化后的程序没有引入数学函数 和float 变量。
对于for循环初始条件j=2,只执行1 次,而对于约束条件j*j<=i,要执 行多次。因此此处还可以优化。
定义变量int t=sqrt(i);约束条件改 为j<=t;
#include<iostream> #include<cmath> using namespace std;
int main() {
return 0; }
int i,j; cout<<2; //输出第一个素数 for(i=3;i<=100;i+=2){ //只检查>=3的奇数
bool mark=true; //默认是素数
double ret=x; ret=a*ret+b; ret=ret*x+c; ret=ret*x+d; return ret; }
枚举法
例题 一元三次方程求解(noip2001tg)
编程,主函数
int main(){ int a,b,c,d; cin>>a>>b>>c>>d; float i; double y1,y2; int count=0;//记录解的个数; for(i=-100;i<100;i+=1){ y1=fx(a,b,c,d,i); y2=fx(a,b,c,d,i+1); double t=y1*y2; if(t==0){//i和i+1至少1个是解 if(y1==0){ if(count){cout<<" "; } cout<<i; count++; if(y2==0){ cout<<" "<<i+1;

优化枚举算法 提升计算思维 ——以“百鸡百钱问题”为例

优化枚举算法 提升计算思维 ——以“百鸡百钱问题”为例

优化枚举算法提升计算思维 ——以“百鸡百钱问题”为例发表时间:2020-12-30T15:07:59.553Z 来源:《中国教师》2020年第26期作者:屈玫琦[导读] 如今,在教学中培养和提升学生的计算思维已成了教学中的重中之重。

屈玫琦杭州市富阳区场口中学摘要:如今,在教学中培养和提升学生的计算思维已成了教学中的重中之重。

本文主要通过在“百钱百鸡问题”的教学中引导学生对枚举算法进行优化和完善来提升学生的计算思维,并迁移到类似问题中,提高学生解决问题的实际能力。

关键词:计算思维;枚举算法;算法优化一、计算思维与枚举法概述1.计算思维简述计算思维并不是一个新概念,人生而有之。

从图灵等人对计算机科学的研究以来,100年的时间,我们进入了信息社会。

计算机领域的发展扩大了计算思维的影响范围,使之成为继实证思维和逻辑思维之后被确立的第三种科学思维模式。

从中小学开始,计算思维就在学科教学中被朦朦胧胧的使用,却从没有向如今般受到重视。

2006年,周以真提出计算思维(Computational Thinking)的概念在全球的计算机教育届引起了广发的关注。

各科学家普遍认为计算思维是计算机领域最具基础性和普遍性,到2050年,每个地球公民都应该掌握计算思维 [1]。

2017年,我国的《普通高中信息技术课程标准》明确指出,计算思维是学科的四大核心素养之一,是个体运用计算机科学领域的思想方法,在形成问题解决方案的过程中产生的一系列思维活动。

具备计算思维的学生在具体的信息活动中能够采用计算书能够处理的方式界定问题,抽象特征、建立结构模型合理组织数据,并运用合理的算法解决问题。

[2课程标准]2.枚举法概述枚举法也称穷举法,是指在有穷的可能解得集合中,逐个搜索集合的每一个元素,用问题给定的检验条件去判断此解是否符合条件,若满足条件,此元素为该问题的一个解。

枚举法是浙江信息技术学业水平考试要求掌握的算法,因为其简单、易理解等特点,也作为信息技术程序设计课程的入门算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

主讲教师:门瑞
信息工程学院

9、 人的价值,在招收诱惑的一瞬间被决定 。20.9.3020.9.30Wednesday, September 30, 2020

10、低头要有勇气,抬头要有低气。21:09:2321:09:2321:099/30/2020 9:09:23 PM

11、人总是珍惜为得到。20.9.3021:09: 2321:0 9Sep-2 030-Se p-20
main() {
int x,y,z;
枚举次数20;x++)
for(y=1;y<=33;y++)
if(((100-x-y)%3==0)&&(5*x+3*y+(100-x-y)/3==100))
{z=100-x-y;
printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",x,y,z);
信息工程L学O院GO
知识拓展
❖试用枚举法解决以下两个问题
• 从1—10的10个数中,每次取2个数,要使它们的 和大于10,一共有多少种取法?
• 从学校到少年宫有4条东西走向的马路和3条南北走 向的马路,小明从学校步行到少年宫(只许向东或 向南行走),最多有多少种走法?
信息工程L学O院GO
LOGO
C语言解法三:
main() {
枚举次数:
3次!
int k;
for(k=1;k<=3;k++)
printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",4k,25-7k,z);
}
信息工程L学O院GO
枚举法
❖优化策略
• 对问题多加分析,减少循环重数和次数。 • 合理选择用于枚举的变量。 • 减少每种情况的判断时间。 • 是否有其他更好的方法。

15、一个人炫耀什么,说明他内心缺 少什么 。。2020年9月 下午9时9分20.9.3021:09September 30, 2020

16、业余生活要有意义,不要越轨。2020年9月30日 星期三 9时9分 23秒21:09:2330 September 2020

17、一个人即使已登上顶峰,也仍要 自强不 息。下 午9时9分23秒 下午9时 9分21:09:2320.9.30
执行的速度严重变慢。
信息工程L学O院GO
百元买百鸡问题
【例2】鸡翁一,值钱五,鸡母一,值钱三,鸡 雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各 几何?
解题思路:
设鸡翁、鸡母、鸡雏的数量分别为x,y,z, 则有以下方程
x+y+z=100 5x+3y+z/3=100 此三元一次方程有多个解,可用枚举法求解。
谢谢大家
LOGO
}
} LOGO
百元买百鸡问题
有没有更好 的解法呢?
信息工程L学O院GO
百元买百鸡问题
x+y+z=100 5x+3y+z/3=100
分析题意可知: k只能取1,2,3
化 简
y=25-7/4*x z=75+3/4*x
令x=4k
x=4k y=25-7k z=75+3k
信息工程L学O院GO
百元买百鸡问题
printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",x,y,z);
}
信息工程L学O院GO
百元买百鸡问题
有没有更 好的解法 呢?
限定变量的取值范围
x的取值范围是1<=x<=20 y的取值范围是1<=y<=33
减少循环的层数、判断时间
z=100-x-y
信息工程L学O院GO
百元买百鸡问题
C语言解法二:
}
信息工程L学O院GO
百元买百鸡问题
C语言解法一:
main() {
int x, y, z;
枚举次数: 100*100*100 =100万次!
for(x=1;x<=100;x++)
for(y=1;y<=100;y++)
for(z=1;z<=100;z++)
if((z%3==0)&&(x+y+z==100)&&(5*x+3*y+z/3==100))
LOGO
枚举法实例
什么是枚举法
❖基本思想
• 枚举也称穷举,指的是从问题可能的解的集 合中一一列举各元素。
• 用题目给定的条件判定哪些是无用的,哪些 是有用的。能使命题成立,即为其解。
• 本质上属于搜索算法
信息工程L学O院GO
什么是枚举法
❖特点
• 容易理解,步骤单一。 • 得到的结果肯定是正确的。 • 通常会涉及到求极值(如最大,最小等)。 • 数据量大的话,可能会造成时间崩溃。
信息工程L学O院GO
引子
【例1】以下式子中的每个汉字代表一个数字,求出 这些汉字代表的数字分别是多少?
慕课制作组
X

组组组组组组
信息工程L学O院GO
枚举法
❖计算机解决枚举问题
• 算法简单、精确度高。 • 常用多重循环解决枚举问题(while循环、for循环)。 • 效率低——当问题的规模变大,循环的阶数增加,
信息工程L学O院GO
百元买百鸡问题
C语言解法一:
main() {
int x, y, z; for(x=1;x<=100;x++)
for(y=1;y<=100;y++) for(z=1;z<=100;z++) if((z%3==0)&&(x+y+z==100)&&(5*x+3*y+z/3==100)) printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",x,y,z);

12、人乱于心,不宽余请。21:09:2321:09:2321:09Wednesday, September 30, 2020

13、生气是拿别人做错的事来惩罚自 己。20.9.3020.9.3021:09:2321:09:23September 30, 2020

14、抱最大的希望,作最大的努力。2020年9月30日 星期三 下午9时9分23秒21:09:2320.9.30
相关文档
最新文档