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

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

算法与数据结构---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


相关文章
|
27天前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
41 1
|
1月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
99 4
|
4天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
44 20
|
28天前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
28天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
1月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
103 23
|
1月前
|
算法
数据结构之蜜蜂算法
蜜蜂算法是一种受蜜蜂觅食行为启发的优化算法,通过模拟蜜蜂的群体智能来解决优化问题。本文介绍了蜜蜂算法的基本原理、数据结构设计、核心代码实现及算法优缺点。算法通过迭代更新蜜蜂位置,逐步优化适应度,最终找到问题的最优解。代码实现了单链表结构,用于管理蜜蜂节点,并通过适应度计算、节点移动等操作实现算法的核心功能。蜜蜂算法具有全局寻优能力强、参数设置简单等优点,但也存在对初始化参数敏感、计算复杂度高等缺点。
60 20
|
28天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
54 5
|
27天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
61 1
|
1月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率

热门文章

最新文章