C++编程《第19课 暴力枚举算法》教学课件.pptxVIP

  • 0
  • 0
  • 约4.89千字
  • 约 29页
  • 2026-03-10 发布于广西
  • 举报

C++编程《第19课 暴力枚举算法》教学课件.pptx

第19课暴力枚举

学习目标1、了解枚举的基本概念3、了解枚举的优缺点2、掌握枚举的经典题型

知识讲授

枚举的概念前面我们已经接触过简单的枚举,了解过枚举的概念。枚举就是列出一个范围内的所有成员的程序,或者说是将所有情况都举出,并判断其是否符合题目条件,生活中常见的枚举有星期里面有星期一、星期二......星期日。关于简单枚举,其概念我们已经抓住要点:一定的范围、所有的成员、特定的类型。

枚举的优缺点优点:1.能举出所有情况,保证解为正确解。2.能解决许多用其他算法难以解决的问题。3.便于思考与编程。缺点:为何要叫做暴力枚举呢?因为理论上这种方式能求解一切问题,而且有时候暴力是会出奇迹的!然而暴力枚举仅适用于一些规模较小的问题,对于规模巨大的情形,连计算机都会无能为力,感叹“机”生苦短!

简单枚举的模板for(inti=1;i=n;i++){if(条件1)语句1;}在数组a中,从元素a[1]一直找到元素a[n]在for循环中查找如果满足条件1,就执行语句1这是最简单的枚举。

多重枚举 有时候,我们需要求解的变量不止一个,需要枚举多个变量,这时候,就不能用简单枚举啦。我们将涉及到多重变量的枚举。即枚举一切可能情形的组合,再从中筛选出合法的解。 枚举两个变量x和y:for(x=left;x=right;x++){

for(y=left1;y=right1;y++){筛选x和y的取值组合;}

}算法复杂度为两种枚举复杂度之乘积,复杂度飙升!

多重枚举 例如x的范围是1-1000,y的范围是1-100时,枚举两个变量x和y:for(x=1;x=1000;x++){

for(y=1;y=100;y++){筛选x和y的取值组合;}

}容易发现,当x=1,y遍历1到100后,x++;x=i时,y也会遍历1到100;这样就形成了x=1到1000,y=1-100的全部取值组合。循环次数为内外循环次数之乘积。

课堂练习一只公鸡值5元,一只母鸡值3元,而1元可买3只小鸡。现有100元钱,想买100只鸡。问可买公鸡、母鸡、小鸡各几只?多重枚举示例-百钱买百鸡

思路解析在数学中解决这个问题,我们通常会列出一个方程组,设公鸡x只,母鸡y只,小鸡z只,则:

x+y+z=100

5*x+3*y+z/3=100

同时满足上述两个条件的x、y、z值就是所求。为了解决以上的问题,我们可以通过三重循环将所有情况都列一遍,然后通过if判断是不是满足条件,如果满足条件,便输出。公鸡数量x的取值范围是0~100/5,母鸡数量y的取值范围是0~100/3,小鸡数量z的取值范围是0~3*100。

参考代码#includeiostreamusingnamespacestd;intmain(){intx,y,z;for(x=0;x=100/5;x++)for(y=0;y=100/3;y++)for(z=0;z=3*100;z++){if(5*x+3*y+z/3==100x+y+z==100)coutxyzendl; } return0;}这样的写法对吗?运行结果:

02575

32077

41878

71380

81181

11683

12484百钱买百鸡

运行结果检验xyzx+y+z5*x+3*y+z/302575100 100

32077100 100+2/3

41878100 100

71380100 100+2/3

81181100 100

11683100 100+2/3

12484100 100标红色的行数据出现了问题,小鸡的数量必须是3的倍数。

参考代码#includeiostreamusingnamespacestd;intmain(){intx,y,z;for(x=0;x=100/5;x++)for(y=0;y=100/3;y++)

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档