第2章 枚举

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.4 解不等式
2.4.1 分数不等式 案例提出: 案例提出:
1. 枚举设计要点 设和变量为s 递增变量为i 两者赋初值为0 设和变量为s,递增变量为i,两者赋初值为0。 s<=m1的条件循环中 根据递增变量i 的条件循环中, 在s<=m1的条件循环中,根据递增变量i对s累 加求和,直至出现s>m1退出循环,赋值c=i s>m1退出循环 c=i, 加求和,直至出现s>m1退出循环,赋值c=i,所得 解区间的下限。 c为n解区间的下限。 继续在s<=m2的条件循环中,根据递增变量i对 继续在s<=m2的条件循环中,根据递增变量i s<=m2的条件循环中 累加求和,直至出现s>m2退出循环, s>m2退出循环 s累加求和,直至出现s>m2退出循环,通过赋值 d=i所得d 解区间的上限。注意, d=i-1,所得d为n解区间的上限。注意,解的上限 d=i而不是i 是d=i-1,而不是i。 然后打印输出不等式的解区间[c,d] [c,d]。 然后打印输出不等式的解区间[c,d]。
2.5 求最值
2.5.2 整数的因数比 案例提出: 案例提出: 设整数a的小于其本身的因数之和为s 设整数a的小于其本身的因数之和为s,定义 p(a)=s/a 为整数a的因数比。 为整数a的因数比。 [x,y]中整数的因数比最大值 中整数的因数比最大值。 试求指定区间 [x,y]中整数的因数比最大值。
1. 枚举设计要点
为了求整数a的因数和s,显然1是因数。 为了求整数a的因数和s,显然1是因数。设置 s,显然 k(2——sqrt(a))循环枚举 如果k ——sqrt(a))循环枚举, 的因数, k(2——sqrt(a))循环枚举,如果k是a的因数, a/k也是 的因数。显然k≤a/k 也是a k≤a/k。 则a/k也是a的因数。显然k≤a/k。 如果a=b*b 显然k=b,a/k=b 此时k=a/k a=b*b, k=b,a/k=b, k=a/k。 如果a=b*b,显然k=b,a/k=b,此时k=a/k。 而因数b只有一个,所以此时必须从和s 而因数b只有一个,所以此时必须从和s中减去一 这样处理以避免重复。 个b,这样处理以避免重复。 设置max存储因数比最大值。 max存储因数比最大值 设置max存储因数比最大值。枚举区间内每 一整数a 求得其因数和s 通过s/a max比较求 s/a与 一整数a,求得其因数和s。通过s/a与max比较求 取因数比最大值。 取因数比最大值。
2.6 数组与数列
基于2x+3 2.6.2 基于2x+3y的递推数列
案例提出: 案例提出:
已知集合A定义如下: 已知集合A定义如下: 1∈A, (1)1∈A,2∈A x,y∈A且 (2)x,y∈A且x≠y => 2x+3y∈A 再无其他数属于A (3)再无其他数属于A。 试求集合A中元素从小到大排列序列的第n 试求集合A中元素从小到大排列序列的第n项。
1. 枚举设计要点
设置y从1开始递增1取值,对于每一个y值,计算 设置y 开始递增1取值,对于每一个y a=n*y*y后判别 后判别: a=n*y*y后判别: a+1为某一整数 的平方, (x,y)即为所求佩尔方程 为某一整数x 若a+1为某一整数x的平方,则(x,y)即为所求佩尔方程 的基本解。 的基本解。 a+1不是平方数 不是平方数, 后再试,直到找到解为止。 若a+1不是平方数,则y增1后再试,直到找到解为止。 应用以上枚举探求,如果解的位数不太大, 应用以上枚举探求,如果解的位数不太大,总可以求出 相应的基本解。 相应的基本解。 如果基本解太大,应用枚举无法找到基本解, 如果基本解太大,应用枚举无法找到基本解,可约定一 个枚举上限,例如10000000 可把y<=10000000 10000000。 y<=10000000作为循环条 个枚举上限,例如10000000。可把y<=10000000作为循环条 y>10000000时结束循环 输出“ 时结束循环, 件,当y>10000000时结束循环,输出“未求出该方程的基本 而结束。 解!”而结束。
1. 枚举设计要点 一般地, 一般地,设m,n为一位正整数,含有数字m且不能被 为一位正整数,含有数字m 整除的n位整数的个数为g1 这些整数的和为s1 g1, s1。 m整除的n位整数的个数为g1,这些整数的和为s1。 其中恰含2个数字m的整数的个数g2及其和s2 g2及其和s2。 其中恰含2个数字m的整数的个数g2及其和s2。
1. 枚举设计要点
设置a数组存储序列各项,a(t)为序列的第t 设置a数组存储序列各项,a(t)为序列的第t项。 为序列的第 显然a(1)=1,a(2)=2 a(1)=1,a(2)=2。 显然a(1)=1,a(2)=2。 为项数, t<n的条件循环中 变量k 的条件循环中, 设t为项数,在t<n的条件循环中,变量k从2开 始递增1取值。 始递增1取值。 可由已有的项a(j) a(j), (j<i)推得 推得, 若k可由已有的项a(j),a(i) (j<i)推得,即 满足k=2*a(j)+3*a(i) k=2*a(i)+3*a(j), 若k满足k=2*a(j)+3*a(i) 或k=2*a(i)+3*a(j), 说明k 数列中的一项,赋值给a(t) a(t)。 说明k是a数列中的一项,赋值给a(t)。 当项数t达到规定项数n 则退出循环, 当项数t达到规定项数n时,则退出循环,打印 输出a(n)后结束。 a(n)后结束 输出a(n)后结束。
2. 枚举设计描述 枚举设计描述
scanf("%lf,%lf",&x,&y); 枚举区间内的a for(a=x;a<=y;a++) // 枚举区间内的a {s=1;b=sqrt(a); 试商寻求a的因数k for(k=2;k<=b;k++) // 试商寻求a的因数k if(fmod(a,k)==0) s=s+k+a/k; s=sif(a==b*b) s=s-b; t=s/a; if(max<t) {max=t;a1=a;s1=s;} } printf(" %.0f,%.4f \n",a1,max);
2. 枚举设计描述 枚举设计描述
y=1; while(y<=10000000) { y++; // 设置y从1开始递增1枚举 设置y 开始递增1 a=n*y*y; x=floor(sqrt(a+1)); if(x*x==a+1) // 检测是否满足方程 y=%.0f\ { printf(" x=%.0f, y=%.0f\n",x,y); break; } }
2.2 统计与求和
2.2.1 指定特殊整数 案例提出: 案例提出: 试求含有数字7且不能被7整除的5 试求含有数字7且不能被7整除的5位整数的个 并求这些整数的和。 数,并求这些整数的和。 同时,求这些整数中恰含2个数字7 同时,求这些整数中恰含2个数字7的整数的个 以及这些整数的和。 数,以及这些整数的和。
3. 枚举的实施步骤
(1)根据问题的具体情况确定枚举量(简单变量 根据问题的具体情况确定枚举量( 或数组); 或数组); (2)根据问题的具体实际确定枚举范围,设置枚 根据问题的具体实际确定枚举范围, 举循环; 举循环; 根据问题的具体要求确定筛选(约束)条件; (3)根据问题的具体要求确定筛选(约束)条件; 设计枚举程序并运行、调试, (4)设计枚举程序并运行、调试,对运行结果进 行分析与讨论。 行分析与讨论。
2. 枚举的框架描述
n=0; for(k=<区间下限>;k<=<区间上限 区间下限>;k<=<区间上限>;k++) for(k=<区间下限>;k<=<区间上限>;k++) // 控制枚举范围 if(<约束条件 约束条件>) if(<约束条件>) // 根据约束条件实施筛选 { printf(<满足要求的解>); // 输出解 printf(<满足要求的解>); 满足要求的解 n++; // 统计解的个数 }
2. 枚举设计描述 枚举设计描述 scanf("%d",&n); a[1]=1;a[2]=2;t=2;k=2; while(t<n) 枚举k是否为A {k++;h=0; // 枚举k是否为A集项 for(i=2;i<=t;i++) {for(j=1;j<=i{for(j=1;j<=i-1;j++)
2.3 解方程
2.3.1 解佩尔方程 案例提出: 案例提出: 佩尔(Pell)方程是关于x,y (Pell)方程是关于x,y的二次不定方程 佩尔(Pell)方程是关于x,y的二次不定方程
(其中n为非平方正整数) 其中n为非平方正整数) x=1或x=y=0时 显然满足方程。常把x,y 当x=1或x=-1,y=0时,显然满足方程。常把x,y 中有一个为零的解称为平凡解。 中有一个为零的解称为平凡解。我们要求佩尔方程 的非平凡解。 的非平凡解。
2. 枚举设计描述 枚举设计描述
scanf("%ld,%ld",&m1,&m2); i=0;s=0; while(s<=m1) {i=i+1;s=s+sqrt(i)/(i+1);} c=i; do {i=i+1;s=s+sqrt(i)/(i+1);} while(s<=m2); n”,c,iprintf(“ %ld≤n≤%ld \n”,c,i-1);
第2章
教学要求
枚 举
了解枚举算法的概念与枚举设计要领 了解枚举算法的概念与枚举设计要领 算法的概念与枚举设计 应用枚举求解统计求和与求最值等基本案例
本章重点
对某些枚举算法进行改进与优化 掌握枚举算法时间复杂度分析
2.1 枚举概述
1. 枚举的概念
(1) 枚举法(Enumerate)也称为列举法、穷举法, 枚举法(Enumerate)也称为列举法、穷举法, 是蛮力策略的体现,又称为蛮力法。 是蛮力策略的体现,又称为蛮力法。 (2) 枚举是一种简单而直接地解决问题的方法,其 枚举是一种简单而直接地解决问题的方法, 基本思想是逐一列举问题所涉及的所有情形 。 (3) 应用枚举时应注意对问题所涉及的有限种情形 进行一一列举,既不能重复,又不能遗漏。 进行一一列举,既不能重复,又不能遗漏。
2. 枚举设计描述 枚举设计描述
for(k=t;k<=10*t枚举每一个n for(k=t;k<=10*t-1;k&#lt;=9;j++) f[j]=0; for(j=1;j<=n;j++) { c=d%10; f[c]+=1; d=d/10; } if(f[m]>0 && k%m>0) {g1++;s1+=k;} if(f[m]==2 && k%m>0) {g2++;s2+=k;} }
if(k==2*a[j]+3*a[i] || k==2*a[i]+3*a[j])
{ h=1;t++;a[t]=k;} if(h==1) break;} } printf("
(1) 设置k循环,循环n-1次相乘求出最小的n位整数t。 设置k循环,循环n 次相乘求出最小的n位整数t 然后设置k 10*t- 循环,枚举所有n位整数。 然后设置k从t至10*t-1循环,枚举所有n位整数。 每个n位整数k赋给d(为了保持k不变) 然后通过n次求余先后分离出k d(为了保持 (2) 每个n位整数k赋给d(为了保持k不变)。然后通过n次求余先后分离出k 的数字c 并通过f(c)=f(c)+1统计数字c 的个数。 f(c)=f(c)+1统计数字 的数字c,并通过f(c)=f(c)+1统计数字c 的个数。 例如f(7)=2 说明k中恰含2个数字7 f(7)=2, f(3)>0,说明k中含有数字3 例如f(7)=2,说明k中恰含2个数字7;若f(3)>0,说明k中含有数字3。 k%m>0检测含有数字 且不能被m整除,g1与s1作统计求和 检测含有数字m 作统计求和。 (3) 据f(m)>0 && k%m>0检测含有数字m且不能被m整除,g1与s1作统计求和。 (4) 据f(m)=2 && k%m>0检测恰含2个m且不能被m整除,g2与s2作统计求和。 f(m)= k%m>0检测恰含 检测恰含2 且不能被m整除,g2与s2作统计求和 作统计求和。
相关文档
最新文档