程序技术好文:算法与数据结构

简介: 程序技术好文:算法与数据结构

算法与数据结构---2、枚举打赏


目录


一、总结一句话总结:1、枚举法的代码结构?2、枚举算法的常用优化?3、枚举法敲代码技巧?二、枚举一、枚举法的基本思想二、枚举法的框架结构三、枚举法的优缺点四、枚举算法的优化 五、枚举法敲代码技巧(注意)三、百钱买百鸡问题及优化1、问题2、分析及代码实现3、优化一:缩小枚举范围4、优化二:减少枚举变量5、优化三:根据题目关系,进一步减少枚举变量


回到顶部一、总结


一句话总结:


枚举法又称穷举法,它是根据题意,枚举所有可能状态,并用问题给定的条件来约束状态,检验哪些是需要的,哪些是不需要的。


1、枚举法的代码结构?


循环+判断语句,枚举几个变量就循环几次


设ai1—状态元素ai的最小值;aik—状态元素ai的最大值(1≤i≤n),即a11≤a1≤a1k,a21≤a2≤a2k, ai1≤ai≤aik,


……,an1≤an≤ank


for(a1=a11;a1<=a1k;a1++)


for(a2=a21;a2<=a2k;a2++)


.....


for(ai=ai1;ai<=aik;ai++)


.....


for(an=an1;an<=ank;an++)


if(状态(a1,...,ai...,an)满足检验条件)


输出问题的解;


2、枚举算法的常用优化?


a、缩小枚举范围


b、减少枚举变量


c、使用其它算法


3、枚举法敲代码技巧?


弄清楚枚举变量、枚举范围、枚举判断条件,敲代码就非常简单,而且不容易出错了


枚举变量:


枚举范围:


枚举判断条件:


1 /


2


3 枚举变量:公鸡


4 枚举范围:公鸡1-14,总计算次数14


5 枚举判断条件:


6 钱数=100:5公鸡+3母鸡+1/3小鸡 = 100


7 小鸡%3==0


8 (100-7x)%4==0


9


10


11 /


12 #include


13 int main()


14 {


15 for (int i = 1; i <= 14; i++)


16 {


17 if ((100 - 7 i) % 4 == 0)


18 {


19 int y = (100 - 7 i) / 4;


20 int z = 100 - i - y;


21 if (5 i + 3 y + z / 3 == 100 && z % 3 == 0)


22 {


23 printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", i, y, z);


24 }


25 }


26 }


27


28 return 0;


29 }


回到顶部二、枚举


博客对应课程的视频位置:2、枚举

//代码效果参考: http://www.jhylw.com.cn/551020853.html


一、枚举法的基本思想


枚举法又称穷举法,它是根据题意,枚举所有可能状态,并用问题给定的条件来约束状态,


检验哪些是需要的,哪些是不需要的。


枚举结构:循环+判断语句。


二、枚举法的框架结构


设ai1—状态元素ai的最小值;aik—状态元素ai的最大值(1≤i≤n),即a11≤a1≤a1k,a21≤a2≤a2k, ai1≤ai≤aik,


……,an1≤an≤ank


for(a1=a11;a1<=a1k;a1++)


for(a2=a21;a2<=a2k;a2++)


.....


for(ai=ai1;ai<=aik;ai++)


.....


for(an=an1;an<=ank;an++)


if(状态(a1,...,ai...,an)满足检验条件)


输出问题的解;


三、枚举法的优缺点


用枚举法解题的最大的缺点是运算量比较大,解题效率不高,如果枚举范围太大(一般以不超过两百万次为限),在时间上就难以承受。


但枚举算法的思路简单,程序编写和调试方便,比赛时也容易想到,在比赛中,时间是有限的,我们比赛的最终目标是求出问题解,


因此,如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么最好是采用枚举法。


四、枚举算法的优化


a、缩小枚举范围


b、减少枚举变量


c、使用其它算法


五、枚举法敲代码技巧(注意)


弄清楚枚举变量、枚举范围、枚举判断条件,敲代码就非常简单,而且不容易出错了


枚举变量:


枚举范围:


枚举判断条件:


回到顶部三、百钱买百鸡问题及优化


博客对应课程的视频位置:2、枚举


1、问题


百钱买百鸡


公鸡一只五块钱,母鸡一只三块钱,小鸡一块钱三只,


现在要用一百块钱买一百只鸡,每种鸡最少一只,问公鸡、母鸡、小鸡各多少只?


2、分析及代码实现


枚举变量:公鸡、母鸡、小鸡


枚举范围:公鸡、母鸡、小鸡都是1-100次,总计算次数100100100


枚举判断条件:


钱数=100:5公鸡+3母鸡+1/3小鸡 = 100


总鸡数=100:公鸡+母鸡+小鸡 = 100


小鸡%3==0


1 /


2


3 百钱买百鸡


4 公鸡一只五块钱,母鸡一只三块钱,小鸡一块钱三只,


5 现在要用一百块钱买一百只鸡,每种鸡最少一只,问公鸡、母鸡、小鸡各多少只?


6


7


8 枚举变量:公鸡、母鸡、小鸡


9 枚举范围:公鸡、母鸡、小鸡都是1-100次,总计算次数100100100


10 枚举判断条件:


11 钱数=100:5公鸡+3母鸡+1/3小鸡 = 100


12 总鸡数=100:公鸡+母鸡+小鸡 = 100


13 小鸡%3==0


14


15 /


16


17 #include


18 int main()


19 {


20 for (int i = 1; i <= 100; i++)


21 for (int j = 1; j <= 100; j++)


22 for (int k = 1; k <= 100; k++)


23 {


24 if (5 i + 3 j + k / 3 == 100 && k % 3 == 0 && i + j + k == 100)


25 {


26 printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", i, j, k);


27 }


28 }


29 return 0;


30 }


3、优化一:缩小枚举范围


百钱百鸡问题优化一:


5公鸡+3母鸡+1/3小鸡 = 100


公鸡+母鸡+小鸡 = 100


缩小枚举范围


枚举变量:公鸡、母鸡、小鸡


枚举范围:公鸡1-18,母鸡1-32 ,小鸡1-98次,总计算次数183298


枚举判断条件:


钱数=100:5公鸡+3母鸡+1/3小鸡 = 100


总鸡数=100:公鸡+母鸡+小鸡 = 100


小鸡%3==0


1 /


2


3 百钱百鸡问题优化一:


4


5 5公鸡+3母鸡+1/3小鸡 = 100


6 公鸡+母鸡+小鸡 = 100


7


8 缩小枚举范围


9


10 枚举变量:公鸡、母鸡、小鸡


11 枚举范围:公鸡1-18,母鸡1-32 ,小鸡1-98次,总计算次数183298


12 枚举判断条件:


13 钱数=100:5公鸡+3母鸡+1/3小鸡 = 100


14 总鸡数=100:公鸡+母鸡+小鸡 = 100


15 小鸡%3==0


16


17


18 /


19


20 #include


21 int main()


22 {


23 for (int i = 1; i <= 18; i++)


24 for (int j = 1; j <= 32; j++)


25 for (int k = 1; k <= 98; k++)


26 {


27 if (5 i + 3 j + k / 3 == 100 && k % 3 == 0 && i + j + k == 100)


28 {


29 printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", i, j, k);


30 }


31 }


32 return 0;


33 }


4、优化二:减少枚举变量


1 /


2


3 钱数=100:5公鸡+3母鸡+1/3小鸡 = 100


4 总鸡数=100:公鸡+母鸡+小鸡 = 100


5


6 设公鸡 x 只,母鸡 y 只,小鸡 z 只


7


8 5x+3y+1/3z = 100


9 x+y+z = 100


10


11 枚举了x和y之后,z的值是固定的,z=100-x-y


12 所以这个时候,z就不用枚举了


13


14 枚举变量:公鸡,母鸡


15 枚举范围:公鸡1-18,母鸡1-32,总计算次数 1832


16 枚举判断条件:


17 钱数=100:5公鸡+3母鸡+1/3小鸡 = 100


18 小鸡%3==0


19


20 优化:减少了枚举的变量


21 减少枚举的变量之后,枚举的次数大幅减少


22


23 /


24 #include


25 int main()


26 {


27 for (int i = 1; i <= 18; i++)


28 for (int j = 1; j <= 32; j++)


29 {


30 int z = 100 - i - j;


31 if (5 i + 3 j + z / 3 == 100 && z % 3 == 0)


32 {


33 printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", i, j, z);


34 }


35 }


36


37 return 0;


38 }


5、优化三:根据题目关系,进一步减少枚举变量


1 /


2


3 钱数=100:5公鸡+3母鸡+1/3小鸡 = 100


4 总鸡数=100:公鸡+母鸡+小鸡 = 100


5


6 设公鸡 x 只,母鸡 y 只,小鸡 z 只


7


8 5x+3y+1/3z = 100


9 x+y+z = 100


10


11 第一个式子*3


12 15x+9y+z = 300


13 x+y+z = 100


14


15 得:


16 14x+8y=200


17 即


18 7x+4y=100


19 y=(100-7x)/4


20 z=100-x-(100-7x)/4


21


22 根据这个式子,有x之后,我们就可以得到y,从而得到z


23 这里7x小于等于96,x取值为1-14


24


25 枚举变量:公鸡


26 枚举范围:公鸡1-14,总计算次数14


27 枚举判断条件:


28 钱数=100:5公鸡+3母鸡+1/3小鸡 = 100


29 小鸡%3==0


目录
打赏
0
0
0
0
0
分享
相关文章
基于 C# 深度优先搜索算法的局域网集中管理软件技术剖析
现代化办公环境中,局域网集中管理软件是保障企业网络高效运行、实现资源合理分配以及强化信息安全管控的核心工具。此类软件需应对复杂的网络拓扑结构、海量的设备信息及多样化的用户操作,而数据结构与算法正是支撑其强大功能的基石。本文将深入剖析深度优先搜索(Depth-First Search,DFS)算法,并结合 C# 语言特性,详细阐述其在局域网集中管理软件中的应用与实现。
49 3
18个常用的强化学习算法整理:从基础方法到高级模型的理论技术与代码实现
本文系统讲解从基本强化学习方法到高级技术(如PPO、A3C、PlaNet等)的实现原理与编码过程,旨在通过理论结合代码的方式,构建对强化学习算法的全面理解。
62 10
18个常用的强化学习算法整理:从基础方法到高级模型的理论技术与代码实现
|
12天前
|
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
44 7
|
23天前
|
基于 Python 迪杰斯特拉算法的局域网计算机监控技术探究
信息技术高速演进的当下,局域网计算机监控对于保障企业网络安全、优化资源配置以及提升整体运行效能具有关键意义。通过实时监测网络状态、追踪计算机活动,企业得以及时察觉潜在风险并采取相应举措。在这一复杂的监控体系背后,数据结构与算法发挥着不可或缺的作用。本文将聚焦于迪杰斯特拉(Dijkstra)算法,深入探究其在局域网计算机监控中的应用,并借助 Python 代码示例予以详细阐释。
43 6
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
20 0
|
1月前
|
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
66 3
 算法系列之数据结构-Huffman树
Python下的毫秒级延迟RTSP|RTMP播放器技术探究和AI视觉算法对接
本文深入解析了基于Python实现的RTSP/RTMP播放器,探讨其代码结构、实现原理及优化策略。播放器通过大牛直播SDK提供的接口,支持低延迟播放,适用于实时监控、视频会议和智能分析等场景。文章详细介绍了播放控制、硬件解码、录像与截图功能,并分析了回调机制和UI设计。此外,还讨论了性能优化方法(如硬件加速、异步处理)和功能扩展(如音量调节、多格式支持)。针对AI视觉算法对接,文章提供了YUV/RGB数据处理示例,便于开发者在Python环境下进行算法集成。最终,播放器凭借低延迟、高兼容性和灵活扩展性,为实时交互场景提供了高效解决方案。
123 4
|
5月前
|
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
578 9
|
5月前
|
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
145 58
|
3月前
|
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
242 77
下一篇
oss创建bucket