优选枚举法解决百元买百鸡

合集下载

试题青少年编程等级考试Python编程一级试卷3程序填空阅读填空程序试题

试题青少年编程等级考试Python编程一级试卷3程序填空阅读填空程序试题

试题青少年编程等级考试Python编程一级试卷3程序填空阅读填空程序试题一、程序填空1.程序设计:在舞会上,男生、女生各自排成一队。

舞会开始时,依次从男队和女队的队头各出一人配成舞伴。

跳完后的两人重新回到队尾。

例如:boy=['Alex','Steven','Jack'],girl=['Ada*,'Babs'.,'Danla','Jane']输出:Turn1:(Alex,Ada)Turn2:(Steven,Babs)Turn3:(Jack,Danla)Turn4:(Alex,jane)……Turn12:(Jack,jane)代码如下:boy=['Alex','Steven',‘Jack']girl=['Ada','Babs','Danla','Jane']for i in range(12):x,y=① #出队print(“Turn{:2}):({},{})".format(i+1,x,y))boy.append( ② ) #再进队girl.append( ③ ) #再进队(1)程序代码中①处正确的代码是(_______)。

A.boy.pop(l).girl.pop(l) B.girl.pop(l),boy.pop(l)C.boy.pop(0),girl.pop(0) D.girl.pop(0),boy.pop(0)(2)程序代码中②处正确的代码是(_______)。

A.x B.y C.i D.i+1(3)程序代码中③处正确的代码是(_______)。

A.x B.y C.i D.i+12.将下列程序代码补充完整:某同学参加了学校体检,体检的医生告诉他体重超重,需要加强运动。

该同学了解到运动时,心率如能控制在一定范围内,对增强心血管系统和呼吸系统的功能都有很好的效果;超出范围,对身体反而会有损伤。

利用“百钱买百鸡”探讨穷举法

利用“百钱买百鸡”探讨穷举法

利用“百钱买百鸡”探讨穷举法山东省鱼台县第一中学范海涛2009年7月23日16:35 浏览:97 专家浏览:0 | 评论:10 专家评论:0利用“百钱买百鸡”探讨穷举法【课标要求】(1)了解穷举法的基本概念及用穷举法设计算法的基本过程。

(2)能够根据具体问题的要求,使用穷举法设计算法,编写程序求解问题。

【教材处理】由于这是学生首次接触用非解析法解题,如果要求学生很快掌握其基本过程并且能对算法进行优化,将是不现实的。

尤其是考虑到学生的信息技术基础参差不齐,可能差距较大,基础差的学生在可能不能接受太多的内容;而且,就算能“吸收”到全部内容,未必就能全部“消化”。

本节课选取来自《张邱建算经》的百钱买百鸡问题作为本次教学的主题。

这样既能提高学生学习的兴趣,又能使学生容易掌握知识,还可以培养学生的民族自豪感和通过建立数学模型和设计程序解决实际问题的习惯。

【学生情况分析】1、学生在本节课前学习高中信息技术新课程的《算法与程序设计》模块已经有一段时间了,学生对算法和程序设计有了一定的认识,但是在面对实际问题时如何设计算法并且用程序实现算法来解决问题上,尤其是对于无法用解析法解决或者是用解析法解决比较困难的问题如何设计算法还是没有什么思路;2、“百钱买百鸡”问题的数学模型是解不定方程,学生在初中的数学课上学过。

本次课在原有知识的基础上,通过对实际问题的分析找到合适的数学模型,使学生基本理解和掌握穷举法解题的思路;【教学目标】1、知识与技能(1)了解非解析法解题的基本思路;(2)理解和掌握穷举法解题的思路,2、过程与方法经历分析问题、建立数学模型、编写和调试程序,得到最终结果的过程,理解和掌握用穷举法解题的基本思路与过程;3、情感态度与价值观(1)通过主题任务的完成,激发民族自豪感和自身的成就感;(2)通过小组讨论与探究活动,提高团队合作能力,促进探究的热情;(3)通过结合学习生活的实际例子,进一步提高利用信息技术解决学习、生活问题的能力。

枚举法解决百元买百鸡-文档资料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.结束,程序输出结果后退出。

百钱百鸡问题扩展

百钱百鸡问题扩展

百钱百鸡问题及其扩展(陕西师范大学计算机科学学院10级计算机科学与技术)摘要:本文给出了一个百钱百鸡的问题,采用了贪婪法中的枚举法来解决这个问题,通过对比得出了较优的算法,并进一步的扩展了此问题,给出了最佳解决方案。

关键词:贪婪法;枚举法;扩展100 money and one hundred chicken problem and its extension( School of Computer Science ,Shaanxi Normal University ,level 10 computer science and Technology)Abstract: This paper presents 100 money and one hundred chicken problem, using the greedy method of enumeration method to solve this problem, by comparing the obtained optimal algorithm, and further extensions of this problem, and gives the best solution.Key words: greed method; enumeration; extension1、引言蛮力法是基于计算机运算速度快这一特性,在解决问题时采用一种“懒惰”的策略。

比较常用的有枚举法、穷举搜索算法等。

对于百钱百鸡问题,我们可能会想到列出两个三元一次方程,去解这个不定解方程,就能找出问题的解,所以我们想到用枚举法来进行算法设计。

2、问题概述百钱百鸡问题。

中国古代数学家张丘建在他的《算经》中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?3、求解该问题的具体算法:枚举法用枚举法解决问题,通常可以从两个方面进行算法设计。

枚举法

枚举法

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

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

采用枚举算法解题的基本思路:(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)。

百钱百鸡问题

百钱百鸡问题

百鸡问题
公元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.枚举法概述枚举法也称穷举法,是指在有穷的可能解得集合中,逐个搜索集合的每一个元素,用问题给定的检验条件去判断此解是否符合条件,若满足条件,此元素为该问题的一个解。

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

【枚举法】百钱百鸡2

【枚举法】百钱百鸡2

【枚举法】百钱百鸡2题⽬描述中国数学家张邱建(公元五世纪,其它资料不详),在他的《算经》中提出了著名的“百钱买百鸡”问题:鸡翁⼀,值钱五,鸡母⼀,值钱三,鸡雏三,值钱⼀。

百钱买百鸡,问翁、母、雏各⼏何?你的任务是:根据给定的钱数m,和买到的鸡数n,输出所有的⽅案。

如果没有可⾏⽅案,输出None。

输⼊格式只有两个整数m、n(0<m,n<10000) 。

表⽰买鸡⽤的总钱数和总只数。

输出格式若⼲⾏,每⾏3个数,表⽰⼀种可⾏⽅案,分别表⽰鸡翁、鸡母、鸡雏的数量。

样例输⼊1100 100样例输出10 25 754 18 788 11 8112 4 84问题提⽰所有⽅案,第⼀优先级按公鸡的数量从⼩到⼤排列。

思路分析枚举法的⼀些套路,确定以下内容:枚举对象。

有⼏个来⼏重循环枚举范围。

判断条件。

根据题⾯信息,三个未知的枚举对象:公鸡、母鸡和⼩鸡。

鸡的数量最多n只。

需要满⾜两个条件总数为n总的价格为m第⼀版框架for(int i=0;i<=n;i++){//枚举公鸡的可能数量for(int j=0;j<=n;j++){//枚举母鸡的可能数量for(int k=0;k<=n;k++){//枚举⼩鸡的可能数量if(k%3==0&&(i+j+k==n)&&(5*i+3*j+k/3==m)){//数量和钱满⾜要求}}}}分析复杂度三重循环O(n3)的复杂度。

该题⽬范围,显然会超时。

需要进⼀步优化。

对于枚举法优化的⼏个思考⽅向:减少枚举对象剪枝hash代替判断根据数量关系,三种鸡加起来总共n只,那么当已经确定公鸡i,母鸡j时,⼩鸡的数量可等于n−i−j不⽤再循环枚举了。

这样就减少了⼀重循环。

再根据钱的总价为m,那么公鸡最多就是买m5只,母鸡最多就是买m3只,不需要枚举到n,减少⾮必要的枚举。

第⼆版框架for(int i=0;i<=m/5;i++){//枚举公鸡的可能数量 for(int j=0;j<=m/3;j++){//枚举母鸡的可能数量Processing math: 100%int k=n-i-j;//计算⼩鸡的数量if(k%3==0&&(5*i+3*j+k/3==m)){//钱满⾜要求}}}}实现代码#include <iostream>#include <cstdio>using namespace std;int main(){int m,n;bool flag=false;cin>>m>>n;for(int i=0;i<=m/5;i++){//枚举公鸡的数量for(int j=0;j<=m/3-i;j++){//枚举母鸡数量int k=n-i-j;//计算⼩鸡的数量if(k<0) break;//⼩鸡数量⼩于0 不符合要求if(k%3==0&&5*i+3*j+k/3==m){//看钱的总数是否是m flag=true;//标记有存在⽅案cout<<i<<" "<<j<<" "<<k<<endl;}}}if(!flag){//没有组合输出Nonecout<<"None";}return 0;}。

利用“百钱买百鸡”探讨穷举法

利用“百钱买百鸡”探讨穷举法

利用“百钱买百鸡”探讨穷举法山东省鱼台县第一中学范海涛2009年7月23日16:35 浏览:97 专家浏览:0 | 评论:10 专家评论:0利用“百钱买百鸡”探讨穷举法【课标要求】(1)了解穷举法的基本概念及用穷举法设计算法的基本过程。

(2)能够根据具体问题的要求,使用穷举法设计算法,编写程序求解问题。

【教材处理】由于这是学生首次接触用非解析法解题,如果要求学生很快掌握其基本过程并且能对算法进行优化,将是不现实的。

尤其是考虑到学生的信息技术基础参差不齐,可能差距较大,基础差的学生在可能不能接受太多的内容;而且,就算能“吸收”到全部内容,未必就能全部“消化”。

本节课选取来自《张邱建算经》的百钱买百鸡问题作为本次教学的主题。

这样既能提高学生学习的兴趣,又能使学生容易掌握知识,还可以培养学生的民族自豪感和通过建立数学模型和设计程序解决实际问题的习惯。

【学生情况分析】1、学生在本节课前学习高中信息技术新课程的《算法与程序设计》模块已经有一段时间了,学生对算法和程序设计有了一定的认识,但是在面对实际问题时如何设计算法并且用程序实现算法来解决问题上,尤其是对于无法用解析法解决或者是用解析法解决比较困难的问题如何设计算法还是没有什么思路;2、“百钱买百鸡”问题的数学模型是解不定方程,学生在初中的数学课上学过。

本次课在原有知识的基础上,通过对实际问题的分析找到合适的数学模型,使学生基本理解和掌握穷举法解题的思路;【教学目标】1、知识与技能(1)了解非解析法解题的基本思路;(2)理解和掌握穷举法解题的思路,2、过程与方法经历分析问题、建立数学模型、编写和调试程序,得到最终结果的过程,理解和掌握用穷举法解题的基本思路与过程;3、情感态度与价值观(1)通过主题任务的完成,激发民族自豪感和自身的成就感;(2)通过小组讨论与探究活动,提高团队合作能力,促进探究的热情;(3)通过结合学习生活的实际例子,进一步提高利用信息技术解决学习、生活问题的能力。

试卷python软件编程等级考试(三级)编程实操题程序填空阅读填空程序试题

试卷python软件编程等级考试(三级)编程实操题程序填空阅读填空程序试题

试卷python软件编程等级考试(三级)编程实操题程序填空阅读填空程序试题一、程序填空1.程序设计:在舞会上,男生、女生各自排成一队。

舞会开始时,依次从男队和女队的队头各出一人配成舞伴。

跳完后的两人重新回到队尾。

例如:boy=['Alex','Steven','Jack'],girl=['Ada*,'Babs'.,'Danla','Jane']输出:Turn1:(Alex,Ada)Turn2:(Steven,Babs)Turn3:(Jack,Danla)Turn4:(Alex,jane)……Turn12:(Jack,jane)代码如下:boy=['Alex','Steven',‘Jack']girl=['Ada','Babs','Danla','Jane']for i in range(12):x,y=① #出队print(“Turn{:2}):({},{})".format(i+1,x,y))boy.append( ② ) #再进队girl.append( ③ ) #再进队(1)程序代码中①处正确的代码是(_______)。

A.boy.pop(l).girl.pop(l) B.girl.pop(l),boy.pop(l)C.boy.pop(0),girl.pop(0) D.girl.pop(0),boy.pop(0)(2)程序代码中②处正确的代码是(_______)。

A.x B.y C.i D.i+1(3)程序代码中③处正确的代码是(_______)。

A.x B.y C.i D.i+12.请在空格处填写正确的代码,使程序完善。

实现功能:绘制y=x2-2x+ 1的图像#加载numpy模块并限简洁的别名为npimport numpy as np#加载matplotlib.pyplot模块并限简洁的别名为pltimport matplotlib.pyplot as plt#x在-7到9之间,每隔0.1取一个点x=np.arange(-7,9,0.1)_____ = x**2-2*x+1plt.plot(x,________)plt.title('y=x*x-2*x+1')plt.xlabel('x')plt.ylabel('y')plt._________3.阅读程序。

求解“百钱百鸡”问题的最优化算法

求解“百钱百鸡”问题的最优化算法

题意要求用 100 钱买 100 只鸡,若全买公鸡最多买 20 只,显然 x 的值在 0-20 之间;同理, y 的值在 0-33 之间, z 的值在 0-100 之间。 因此, x、y、z 可能的组合方式有 21*34*101=72114 种,对每一种组合方式, 再测试是否符合“百钱、百鸡”这两个条件;若符合,则该组合就是 问题的一个解。 上述思想可编写 MATLAB 程序如下: clc; clear all; for cock=0:20 for hen=0:33 for chicken=0:100 if (5*cock+3*hen+chicken/3==100)&&(cock+hen+chick en==100) [cock,hen,chicken] end end end end 对于上述求解我们称为算法 1,该算法在一般的教科书中都有陈 述, 很明显该算法的时间复杂度为, 最内层的 if 语句被执行了 72114 次。 在答案仅有 4 中组合的情况下,将有 72110 次是无意义的重复执行, 极大浪费了系统资源。
2 现行的求解算法
现行的求解算法主要有两种, 一种是利用三重循环结构来实现的,面的数学分析。 设鸡翁、鸡母、鸡雏的个数分别为 x、y、z, 由题意可得到下面的 方程组:
理论研究
219
求解“百钱百鸡”问题的最优化算法
苏 琳 ( 山东科技大学 土木工程与建筑学院 , 山东 青岛 266000 )
摘 要:“百钱百鸡”问题是一个经典的穷举问题,虽然该问题比较简单,但是目前的算法并没有实现求解过程的最优化。本文充分利用数学 模型中的隐含条件,减少未知量的个数,有效控制循环变量的范围与步长来优化循环次数,最终循环执行 4 次即可求解,使得算法的时间复杂 度从降为,达到算法的最优化,为穷举类问题的求解提供一种新的思路。 关键词:穷举算法;百钱百鸡;优化;Matlab DOI:10.16640/ki.37-1222/t.2018.01.197

算法经典问题系列1百钱买百鸡问题

算法经典问题系列1百钱买百鸡问题

算法经典问题系列1 百钱买百鸡问题一说起唐朝,人们就会情不自禁地想起诗歌,绝对没有人会提到数学在数学上,虽说唐代并没有产生与其前的魏晋南北朝或其后的宋元相媲美的大师,却在数学教育制度的确立和数学典籍的整理方面有所建树.长达近三百年的唐代在数学方面最有意义的事情莫过于《算经十书》的整理和出版,这是高宗李治下令编撰的。

除了《周牌算经》《九章算术》《海岛算经》和《缀术》以外,《算经十书》中至少还有三部值得一提,分别是《孙子算经》《张丘建算经》和《缉古算经》'这三部书的共同特点是,每一部都提出了一个非常有价值的问题,并以此传世。

《张丘建算经》成书于公元5世纪,作者是北魏人.书中最后一道题堪称亮点,通常也被称为"百钱买百鸡"问题,民间则流传着县令考问神童的佳话书中原文如下:今有鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买鸡百只,问鸡翁、母、雏各几何?题目的意思是,公鸡5文钱1只,母鸡3文钱1只,小鸡1文钱买3只,现在用100文钱共买了100只鸡,问:在这100只鸡中,公鸡、母鸡和小鸡各是多少只?(设每种至少一只)算法分析:此题很显然是用枚举法,我们以三种鸡的个数为枚举对象(分别设为x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件,穷举各种鸡的个数。

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

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

1.采用枚举算法解题的基本思路:2.确定枚举对象、枚举范围和判定条件;3.一一枚举可能的解,验证是否是问题的解下面是解这个百鸡问题的程序var x,y,z:integer;begin for x:=1 to 100 do for y:=1 to 100 do for z:=1 to 100 do if(x+y+z=100)and(x*5+y*3+z/3=100)then writeln('x=',x,'y=',y,'z=',z);{验证可能的解,并输出符合题目要求的解}end.这个算法学生容易想到,而重复是计算机的拿手好戏,算法可读性好。

百钱买百鸡问题

百钱买百鸡问题

算法经典问题系列1 百钱买百鸡问题
一说起唐朝 人们就会情不自禁地想起诗歌 绝对没有人会提到数学在数
学上 虽说唐代并没有产生与其前的魏晋南北朝或其后的宋元相媲美的大师 却在数学教育制度的确立和数学典籍的整理方面有所建树.长达近三百年的唐代在数学方面最有意义的事情莫过于《算经十书》的整理和出版 这是高宗李治下令编撰的。

除了《周牌算经》《九章算术》《海岛算经》和《缀术》以外 《算经十书》中至少还有三部值得一提 分别是《孙子算经》《张丘建算经》和《缉古算经》'这三部书的共同特点是 每一部都提出了一个非常有价值的问题 并以此传世。

《张丘建算经》成书于公元5世纪 作者是北魏人.书中最后一道题堪称亮
点 通常也被称为"百钱买百鸡"问题 民间则流传着县令考问神童的佳话书中原文如下
今有鸡翁一 值钱五 鸡母一 值钱三 鸡雏三 值钱一 百钱买鸡百只
问鸡翁、母、雏各几何?
题目的意思是 公鸡5文钱1只 母鸡3文钱1只 小鸡1文钱买3只
现在用100文钱共买了100只鸡 问 在这100只鸡中 公鸡、母鸡和小鸡各是多少只?(设每种至少一只)算法分析
此题很显然是用枚举法 我们以三种鸡的个数为枚举对象(分别设为
x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件 穷举各种鸡的个数。

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

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

1.采用枚举算法解题的基本思路
2.确定枚举对象、枚举范围和判定条件。

枚举算法与百鸡问题

枚举算法与百鸡问题
对于枚举法也不要过于悲观,从全局观点使 用枚举法,计算量容易过大。但是,如果能够 排除哪些明显不属于解集的元素,在局部地方 使用枚举法,其效果会十分显著。
2023/4/2
7
例4(时针问题):
图4-1所示的3×3阵列中有9个时钟,我们的 目标是旋转时钟指针,使所有的时钟都指向12 点。允许旋转时钟的方法有9种,每一种移动用 一个数字号表示。图4-2中给出了9个数字号与 相应的受控制的时钟,这些时钟在图中以灰色 标出,其指针将顺时针旋转90o。求最短的移动 序列。
2023/4/2
14
算法分析
将P1-P9带入下述三个检验条件: C7==(P4+P7+P8)%4 C5=(P5+P1+P3+P7+P9)%4 C9=(P6+P8+P9)%4 一一枚举,就可以求得解。
2023/4/2
15
例4的引申
考虑一个翻硬币游戏,有N(N<=10000)行硬币 ,每行9个硬币,有的硬币正面朝上,有的硬币反 面朝上。每次可以把一行或者一列的所有硬币翻 过来,请问如何翻,使得正面朝上的硬币尽量多 。
P4=order(C1-P1-P2) P6=order(C3-P2-P3)
P5=order(C2-P1-P2-P3) P7=order(C4-P1-P4-P5)
P9=order(C6-P3-P5-P6) P8=order(C8-P7-P9-P5)
得到P4-P9相应的状态值。
其中函数order(n)的返回值为n除以4的余数。
2023/4/2
4
算法分析
分析:用(Xi, Yi, Zi)表示气球i的球心的坐标, 用Ri表示它的半径,对于当前将要膨胀的气球i ,用公式

c语言百钱买百鸡问题

c语言百钱买百鸡问题

百钱买百鸡问题——一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少)。

这是一个古典数学问题,设一百只鸡中公鸡、母鸡、小鸡分别为x ,y ,z ,问题化为三元一次方程组:⎩⎨⎧=++=++)(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~333) z 的取值范围为3~99,步长为3 对于这个问题我们可以用穷举的方法,遍历x,y,z 的所有可能组合,最后得到问题的解。

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

算法细化算法的步骤1实际上是分散在程序之中的,由于用的是for 循环,很方便的初始条件放到了表达式之中了。

步骤2和3是按照步长1去寻找公鸡和母鸡的个数。

步骤4的细化 4.1 z =14.2 是否满足百钱,百鸡4.2.1 满足,输出最终百钱买到的百鸡的结果 4.2.2 不满足,不做处理 4.3 变量增加,这里注意步长为3 流程图图5-8 程序执行流程图程序代码如下#include "stdio.h"main(){int x,y,z;for(x=1;x<=20;x++)for(y=1;y<=33;y++)for(z=3;z<=99;z+=3){if((5*x+3*y+z/3==100)&&(x+y+z==100))/*是否满足百钱和百鸡的条件*/printf("cock=%d,hen=%d,chicken=%d\n",x,y,z);}}分析程序运行结果如下:cock=4,hen=8,chicken=78cock=8,hen=11,chicken=81cock=12,hen=4,chicken=84对于这个问题实际上可以不用三重循环,而是用二重循环,因为公鸡和母鸡数确定后,小鸡数就定了,即y100z 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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);
}
}
百元买百鸡问题
有没有更好 的解法呢?
信息工程学院
百元买百鸡问题
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
信息工程学院
百元买百鸡问题
C语言解法三:
main() {
信息工程学院
百元买百鸡问题
【例2】鸡翁一,值钱五,鸡母一,值钱三,鸡 雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各 几何?
解题思路:
设鸡翁、鸡母、鸡雏的数量分别为x,y,z, 则有以下方程
x+y+z=100 5x+3y+z/3=100 此三元一次方程有多个解,可用枚举法求解。
信息工程学院
百元买百鸡问题
}
信息工程学院
百元买百鸡问题
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))
int x,y,z;
枚举次数:
20*33=660 次!
for(x=1;x<=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);
信息工程学院
知识拓展
❖试用枚举法解决以下两个问共有多少种取法?
• 从学校到少年宫有4条东西走向的马路和3条南北走 向的马路,小明从学校步行到少年宫(只许向东或 向南行走),最多有多少种走法?
信息工程学院
信息工程学院
引子
【例1】以下式子中的每个汉字代表一个数字,求出 这些汉字代表的数字分别是多少?
慕课制作组
X

组组组组组组
信息工程学院
枚举法
❖计算机解决枚举问题
• 算法简单、精确度高。 • 常用多重循环解决枚举问题(while循环、for循环)。 • 效率低——当问题的规模变大,循环的阶数增加,
执行的速度严重变慢。
枚举次数:
3次!
int k;
for(k=1;k<=3;k++)
printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",4k,25-7k,z);
}
信息工程学院
枚举法
❖优化策略
• 对问题多加分析,减少循环重数和次数。 • 合理选择用于枚举的变量。 • 减少每种情况的判断时间。 • 是否有其他更好的方法。
printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",x,y,z);
}
信息工程学院
百元买百鸡问题
有没有更 好的解法 呢?
限定变量的取值范围
x的取值范围是1<=x<=20 y的取值范围是1<=y<=33
减少循环的层数、判断时间
z=100-x-y
信息工程学院
百元买百鸡问题
C语言解法二:
main() {
优选枚举法解决百元买百鸡
LOGO
什么是枚举法
❖基本思想
• 枚举也称穷举,指的是从问题可能的解的集 合中一一列举各元素。
• 用题目给定的条件判定哪些是无用的,哪些 是有用的。能使命题成立,即为其解。
• 本质上属于搜索算法
信息工程学院
什么是枚举法
❖特点
• 容易理解,步骤单一。 • 得到的结果肯定是正确的。 • 通常会涉及到求极值(如最大,最小等)。 • 数据量大的话,可能会造成时间崩溃。
相关文档
最新文档