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

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

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


相关文章
|
9天前
|
存储 算法 Java
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
|
9天前
|
存储 设计模式 算法
数据结构,算法宏观印象构建
数据结构,算法宏观印象构建
|
9天前
|
存储 算法 调度
算法与数据结构-栈篇
算法与数据结构-栈篇
12 0
|
9天前
|
传感器 算法
技术心得记录:四元数及姿态解算Mahony算法
技术心得记录:四元数及姿态解算Mahony算法
14 0
|
9天前
|
存储 人工智能 程序员
技术心得记录:堆(heap)与栈(stack)的区别
技术心得记录:堆(heap)与栈(stack)的区别
|
9天前
|
机器学习/深度学习 算法 数据可视化
技术心得记录:机器学习笔记之聚类算法层次聚类HierarchicalClustering
技术心得记录:机器学习笔记之聚类算法层次聚类HierarchicalClustering
16 0
|
9天前
|
存储 算法 Python
技术心得记录:大整数算法【10】Comba乘法(实现)
技术心得记录:大整数算法【10】Comba乘法(实现)
|
10天前
|
Java BI C#
技术笔记:SM4加密算法实现Java和C#相互加密解密
技术笔记:SM4加密算法实现Java和C#相互加密解密
10 0
|
12天前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
6天前
|
存储 缓存 算法
堆和栈的区别及应用场景
堆和栈的区别及应用场景