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

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

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


相关文章
|
14天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
42 4
|
19天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
19 3
|
30天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
46 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-16
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-16
29 1
|
1月前
|
机器学习/深度学习 人工智能 算法
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-15
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-15
46 1
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-14
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-14
37 1
|
24天前
|
缓存 分布式计算 监控
算法优化:提升程序性能的艺术
【10月更文挑战第20天】算法优化:提升程序性能的艺术
|
1月前
|
存储 人工智能 算法
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18
37 0
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-17
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-17
57 0