1
假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。在某台计算机上实现并完成概算法的时间为t秒。现有另一台计算机,其运行速度为第一台的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?( )
A、n+8
B、n+6
C、n+7
D、n+5
正确答案: B 我的答案:B 得分: 1.4分
答案解析:
3*2^n*64=3*2^x
2
在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( )。
A、回溯法
B、分支限界法
C、回溯法和分支限界法
D、回溯法求解子集树问题
正确答案: B 我的答案:B 得分: 1.4分
答案解析:
3
下列算法中不能解决0/1背包问题的是( )。
A、贪心法
B、动态规划
C、回溯法
D、分支限界法
正确答案: A 我的答案:A 得分: 1.4分
答案解析:
4
算法分析中,记号O表示渐进上界,记号Ω表示( )
A、
渐进下界
B、
渐进上界
C、
非紧上界
D、
紧渐进界
正确答案: A 我的答案:A 得分: 1.4分
5
用回溯法求解最优装载问题时,若待选物品为m种,则该问题的解空间树的结点个数为( )。
A、m!
B、2m+1
C、2m+1-1
D、2m
正确答案: C
6
采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为 ( ) 。
A、O(n2n)
B、O(nlogn)
C、O(2n)
D、O(n)
正确答案: B 我的答案:B 得分: 1.4分
答案解析:
7
下列关于计算机算法的描述不正确的是( )。
A、算法是指解决问题的一种方法或一个过程
B、算法是若干指令的有穷序列
C、算法必须要有输入和输出
D、算法是编程的思想
正确答案: C 我的答案:C 得分: 1.4分
答案解析:
8
直接或间接调用自身的算法称为( )。
A、贪心算法
B、递归算法
C、迭代算法
D、回溯法
正确答案: B 我的答案:B 得分: 1.4分
答案解析:
9
下列不是动态规划算法基本步骤的是( )。
A、找出最优解的性质
B、构造最优解
C、算出最优解(应该是最优值)
D、定义最优解
正确答案: B 我的答案:B 得分: 1.4分
答案解析:
10
一个问题可用动态规划算法或贪心算法求解的关键特征是问题的( )。
A、重叠子问题
B、最优子结构性质
C、贪心选择性质
D、定义最优解
正确答案: B 我的答案:B 得分: 1.4分
答案解析:
11
下面问题( )不能使用贪心法解决。
A、单源最短路径问题
B、N皇后问题
C、最小花费生成树问题
D、背包问题
正确答案: B 我的答案:B 得分: 1.4分
12
回溯法的效率不依赖于以下哪一个因素?( )
A、产生x[k]的时间;
B、满足显约束的x[k]值的个数;
C、问题的解空间的形式;
D、计算上界函数bound的时间;
E、满足约束函数和上界函数约束的所有x[k]的个数。
F、计算约束函数constraint的时间;
正确答案: C 我的答案:C 得分: 1.4分
答案解析:
13
下列哪个问题可以用贪心算法求解( )。
A、LCS问题
B、批处理作业问题
C、0-1背包问题
D、哈夫曼编码问题
正确答案: D 我的答案:D 得分: 1.4分
答案解析:
14
二分搜索算法是利用( )实现的算法。
A、分治策略
B、动态规划法
C、贪心法
D、回溯法
正确答案: A 我的答案:A 得分: 1.4分
答案解析:
15
Hanoi塔问题如下图所示。现要求将塔座A上的的所有圆盘移到塔座B上,并仍按同样顺序叠置。移动圆盘时遵守Hanoi塔问题的移动规则。由此设计出解Hanoi塔问题的递归算法正确的为:( )
A、
void hanoi(int n, int A, int C, int B){
if (n > 0) {
hanoi(n-1,A,C, B);
move(n,a,b);
hanoi(n-1, C, B, A);
}
}
B、
void hanoi(int n, int A, int B, int C){
if (n > 0){
hanoi(n-1, A, C, B);
move(n,a,b);
hanoi(n-1, C, B, A);
}
}
C、
void hanoi(int n, int C, int B, int A){
if (n > 0){
hanoi(n-1, A, C, B);
move(n,a,b);
hanoi(n-1, C, B, A);
}
}
D、
void hanoi(int n, int C, int A, int B) {
if (n > 0){
hanoi(n-1, A, C, B);
move(n,a,b);
hanoi(n-1, C, B, A);
}
}
正确答案: B 我的答案:B 得分: 1.4分
答案解析:
16
下列算法中通常以自底向上的方式求解最优解的是( )。
A、备忘录法
B、动态规划法
C、贪心法
D、回溯法
正确答案: B 我的答案:B 得分: 1.4分
答案解析:
17
最长公共子序列算法利用的算法是( )。
A、分支界限法
B、动态规划法
C、贪心法
D、回溯法
正确答案: B 我的答案:B 得分: 1.4分
答案解析:
18
应用Johnson法则的流水作业调度采用的算法是( )
A、贪心算法
B、分支限界法
C、分治法
D、动态规划算法
正确答案: D 我的答案:D 得分: 1.4分
答案解析:
19
设问题规模为N时,某递归算法的时间复杂度记为T(N),已知T(1)=1,T(N)=2T(N/2)+N/2,用O表示的时间复杂度为( )。
A、O(logN)
B、O(N)
C、O(NlogN)
D、O(N²logN)
正确答案: C 我的答案:C 得分: 1.4分
答案解析:
20
实现循环赛日程表利用的算法是( )。
A、分治策略
B、动态规划法
C、贪心法
D、回溯法
正确答案: A 我的答案:A 得分: 1.4分
答案解析:
21
动态规划法求解问题的基本步骤不包括( )。
A、递归地定义最优值
B、分析最优解的性质,并刻画其结构特征
C、根据计算最优值时得到的信息,构造最优解(可以省去的)
D、以自底向上的方式计算出最优值
正确答案: C 我的答案:C 得分: 1.4分
答案解析:
22
下列哪个问题不用贪心法求解( )。
A、哈夫曼编码问题
B、单源最短路径问题
C、最大团问题
D、最小生成树问题
正确答案: C 我的答案:C 得分: 1.4分
答案解析:
23
使用二分搜索算法在n个有序元素表中搜索一个特定元素,在最好情况和最坏情况下搜索的时间复杂性分别为( )。
A、O(1),O(logn)
B、O(n),O(logn)
C、O(1),O(nlogn)
D、O(n),O(nlogn)
正确答案: A 我的答案:A 得分: 1.4分
答案解析:
24
分治法所能解决的问题应具有的关键特征是( )。
A、该问题的规模缩小到一定的程度就可以容易地解决
B、该问题可以分解为若干个规模较小的相同问题
C、利用该问题分解出的子问题的解可以合并为该问题的解
D、该问题所分解出的各个子问题是相互独立的
正确答案: C 我的答案:C 得分: 1.4分
答案解析:
25
算法必须具备输入、输出和( )等4个特性。
A、可行性和安全性
B、确定性和易读性
C、有穷性和安全性
D、有穷性和确定性
正确答案: D 我的答案:D 得分: 1.4分
答案解析:
26
回溯法在问题的解空间树中,按( )策略,从根结点出发搜索解空间树。
A、广度优先
B、活结点优先
C、扩展结点优先
D、深度优先
正确答案: D 我的答案:D 得分: 1.4分
答案解析:
27
动态规划算法的基本要素为( )
A、最优子结构性质与贪心选择性质
B、重叠子问题性质与贪心选择性质
C、最优子结构性质与重叠子问题性质
D、预排序与递归调用
正确答案: C 我的答案:C 得分: 1.4分
答案解析:
28
能采用贪心算法求最优解的问题,一般具有的重要性质为:( )
A、最优子结构性质与贪心选择性质
B、重叠子问题性质与贪心选择性质
C、最优子结构性质与重叠子问题性质
D、预排序与递归调用
正确答案: A 我的答案:A 得分: 1.4分
答案解析:
29
下列关于回溯法的描述不正确的是( )。
A、回溯法也称为试探法
B、回溯法有“通用解题法”之称
C、回溯法是一种能避免不必要搜索的穷举式搜索法
D、用回溯法对解空间作深度优先搜索时只能用递归方法实现
正确答案: D 我的答案:D 得分: 1.4分
答案解析:
30
Fibonacci数列中,第4个和第11个数分别是( A)。
A、5,89
B、3,89
C、5,144
D、3,144
1
动态规划算法的两个基本要素是____和____。
正确答案:
第一空:
最优子结构
第二空:
重叠子问题
2
合并排序算法使用的是____算法设计的思想。
正确答案:
第一空:
分治
3
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为M,应如何选择装入背包的物品,使得装入背包中物品的总价值最大。
贪心算法如下:
float greedy_knapsack(float M,float w[],float p[],float x[]) {
//x[]背包问题最优解, w[ ]物品重量,P[]物品价值
int n=w.length;
float pp=0;
float mm=M; //pp计算当前总价值,mm背包剩余载重
for( int i=1;i<=n; i++ ) {
float ww[i]=____; //计算物品单位价值ww[ ]
x[i]=0;
} //初始化
Mergesort(w[], n); //按单位价值ww[]将物品降序, 便于贪心选择
for(int i=1; i<=n; i++ ) {//贪心选择,总是选择价值最大放入背包
if(w[i]<=mm) {//当前物品小于背包剩余载重
x[i]=1;
mm=____;
pp=____;
} else {
x[i]=mm/w[i];
pp=____;
break;
} //i部分放入背包
}
return pp;
}
正确答案:
第一空:
p[i] / w[i]
第二空:
mm - w[i]
第三空:
pp + p[i]
第四空:
pp + x[i]*p[i]
4
矩阵连乘问题的算法可由____算法设计实现。
正确答案:
第一空:
动态规划
5
算法是由若干条指令组成的有穷序列,且要满足输入、输出、____和 ____ 四条性质。
正确答案:
第一空:
确定性
第二空:
有限性
6
用回溯法解0/1背包问题时,计算结点的上界的函数如下所示,请在空格中填入合适的内容:
int Bound(int i){// 计算上界
int cleft = c - cw; // 剩余容量
int b = cp; // 结点的上界
// 以物品单位重量价值递减序装入物品
while (i <= n && w[i] <= cleft) {
____________;
____________;
____________;
}
// 装满背包
if (i <= n) ____________ ;
return b;
}
正确答案:
第一空:
cleft -= w[i]
第二空:
b += p[i]
第三空:
i++
第四空:
b += p[i]/w[i] * cleft
7
走迷宫问题。迷宫是许多小方格构成的矩形,在每个小方格中有的是墙(用 “1”表示)有的是路(用“0”表示)。走迷宫就是从一个小方格沿上、下、左、右四个方向到邻近的方格,当然不能穿墙。设迷宫的入口是在左上角(1,1),出口是右下角(8,8)。根据给定的迷宫,找出一条从入口到出口的路径。
说明:数组maze[8][8]存放迷宫;用数组fx[4]={1,-1,0,0},fy[4]={0,0,-1,1}模拟上下左右搜索时的下标的变化过程;用迷宫原有的存储空间置元素值为“-1”时,标识已经访问过该方格。用数组做队的存储空间,队中的成员有三个:行号、列号、前一个方格在队列中的下标。
struct {
int x,y,pre;
}sq[100];//数组sq用来模拟队列
void search(){
qh=0; qe=1;//队列的队首和队尾
maze[1][1]=____;
sq[1].pre=0; sq[1].x=1; sq[1].y=1;
while(____) {
qh=qh+1;
for(k=1;k<=4;k++){
i=sq[qh].x+fx[k];
j=sq[qh].y+fy[k];
if (check(i,j)==1) { //check()用来检查该方格是否可行
____;
sq[qe].x=i; sq[qe].y=j; sq[qe].pre=qh;
maze[i][j]=-1;
if(sq[qe].x==8 && sq[qe].y==8) {
out(); // out()用来输出找到的路径
return;
}
}
}
}
printf("No avaliable way. \n");
}
正确答案:
第一空:
-1
第二空:
qh!=qe
第三空:
qe=qe+1
8
n后问题回溯算法
(1)用二维数组A[N][N]存储皇后位置,若第i行第j列放有皇后,则A[i][j]为非0值,否则值为0。
(2)分别用一维数组M[N]、L[2*N-1]、R[2*N-1]表示竖列、左斜线、右斜线是否放有棋子,有则值为1,否则值为0。
void dfs(int i, int M[], int L[], int R[], int A[]) {
for(j=0;j if(____) {/*安全检查*/ A[i][j]=i+1; /*放皇后*/ ____; if(i==N-1) {……} //输出结果(略去代码); else____; /*试探下一行*/ ____; /*去皇后,回溯*/ ____; } } 正确答案: 第一空: !M[j] && !L[i+j] && !R[i-j+N] 第二空: M[j]=L[i+j]=R[i-j+N]=1 第三空: dfs(i+1,M,L,R,A) 第四空: A[i][j]=0 第五空: M[j]=L[i+j]=R[i-j+N]=0 9 若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X和Y的一个最长公共子序列____。 正确答案: 第一空: {BABCD}或{CABCD}或{CADCD} 10 有11个待安排的活动,它们具有下表所示的开始时间与结束时间,如果以贪心算法求解这些活动的最优安排(即为活动安排问题:在所给的活动集合中选出最大的相容活动子集合),得到的最大相容活动子集合为活动____。 正确答案: 第一空: {1,4,8,11} 0-1背包问题的解空间树为____树;n后问题的解空间树为____树; 正确答案: 第一空: 子集 第二空: 排列 12 f(n)=3n2+10的渐近性态f(n)= O(____), g(n)=10log3n的渐近性态g(n)= O(____)。 正确答案: 第一空: n2 第二空: N 13 所谓贪心选择性质是指____。 正确答案: 第一空: 所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到 14 动态规划算法的基本思想是将待求解问题分解成若干____,先求解____,然后从这些____的解得到原问题的解。 正确答案: 第一空: 子问题 第二空: 子问题 第三空: 子问题 15 用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。 如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为____。 正确答案: 第一空: O(h(n)) 16 数塔问题。有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大。 #define MAXV 10005 int a[MAXV][MAXV];//数塔中的元素 int dp[MAXV][MAXV];//dp[i][j]为(i,j)到底部的最小路径和 int n;//数塔的行数 int Search() { int i,j; for(j=0; j ____ ; } for (i=n-2; i>=0; i--) { for (j=0; j<=i; j++) { dp[i][j]=____ ; } } return ____ ; } 正确答案: 第一空: dp[n-1][j]=a[n-1][j] 第二空: min(dp[i+1][j],dp[i+1][j+1])+a[i][j] 第三空: dp[0][0] 17 用分治法实现快速排序算法时,最好情况下的时间复杂性为____,最坏情况下的时间复杂性为____,该算法所需的时间与____和____两方面因素有关。 正确答案: 第一空: O(nlogn) 第二空: O(n^2) 第三空: 运行时间 第四空: 划分 18 回溯法搜索解空间树时常用的两种剪枝函数为____和____。 正确答案: 第一空: 约束函数 第二空: 限界函数 19 一个“好”的算法应具有正确性、____、____和高效率和低存储量需求等特性。 正确答案: 第一空: 可读性 第二空: 健壮性 20 贪心算法总是做出在当前看来____的选择。也就是说贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的____。 正确答案: 第一空: 最好 第二空: 局部最优选择 21 Hanoi算法 void move(int i, char x, char y){ printf("把盘子%d从%c柱移动到%c柱\n",i,x,y); } void Hanoi(int n, char a, char b, char c){ if(n==1) ____ ; else{ ____ ; ____; Hanoi(n-1, b, a, c); } } 正确答案: 第一空: move(n,a,c) 第二空: Hanoi(n-1, a, c , b) 第三空: Move(n,a,c) 22 贪心算法的两个基本要素是____和____。 正确答案: 第一空: 贪心选择性 第二空: 最优子结构 23 用回溯法解0/1背包问题时,该问题的解空间结构为____结构。 正确答案: 第一空: 子集树 24 旅行售货员问题的解空间树是____。 正确答案: 第一空: 排列树 25 在快速排序、插入排序和合并排序算法中,____算法不是分治算法。 正确答案: 第一空: 插入排序 1 最优子结构性质是指原问题的最优解包含其子问题的最优解。 正确答案:√ 所有的递归函数都能找到对应的非递归定义。 正确答案:√ 动态规划算法求解问题时,分解出来的子问题相互独立。 正确答案:× 满足贪心选择性质必满足最优子结构性质。 正确答案:× 用贪婪算法解决零钱兑换问题时,总能找到问题的最优解。 正确答案:× 好的算法在很大程度上取决于问题中数据所采用的数据结构。 正确答案:√ 动态规划算法基本要素的是最优子结构。 正确答案:√ 在最好情况下、最坏情况下、平均情况下的时间复杂度中,可操作性最好的且最有实际价值的,是最坏情况下的时间复杂度。 正确答案:× 定义递归函数时可以没有初始值。 正确答案:× 回溯法中限界函数的目的是剪去得不到最优解的子树。 正确答案:√ 写出在一个整数序列中找最大数和最小数的分治算法。并用如下实例验证求解过程: a[]={48,12,61,3,5,19,32,7} void maxmin(int a[],int i,int j,int &max,int &min) { //参数:a[]待查数组;i、j下标范围;max、min找到的最大值和最小值 } void maxmin(int a[],int i,int j,int &max,int &min) { int mid; int lmax,lmin,rmax,rmin; if(j==i) { max=a[i]; min=a[i]; } else if(j-i==1) { if(a[i]>a[j]) { max=a[i]; min=a[j]; } else { max=a[j]; min=a[i]; } } else { mid=i+(j-i)/2; maxmin(a,i,mid,lmax,lmin); maxmin(a,mid+1,j,rmax,rmin); if(lmax>rmax) max=lmax; else max=rmax; if(lmin else min=rmin; } } 写出设计动态规划算法的主要步骤。 正确答案: ① 分析最优子结构性质; ② 定义最优值的递归关系表达式; ③ 设计算法计算出最优值; ④ 利用最优值构造最优解; 简单描述分治法的基本思想。 正确答案: 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同;对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止;将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。 写出求解矩阵链积的动态规划算法。并用如下实例验证计算过程: k个矩阵Ak,k=1,2,3,4,5,6,r1=5,r2=10,r3=3,r4=12,r5=5,r6=50,r7=6,求矩阵链积A1×A2×A3×A4×A5×A6的最小相乘次数以及实现该最小相乘次数的求积顺序。 正确答案: 完整代码: #include #include #define MAXV 1005 using namespace std; int n, p[MAXV], m[MAXV][MAXV]; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> p[i - 1] >> p[i]; for (int i = 1; i <= n; i++) m[i][i] = 0; for (int l = 2; l <= n; l++) { for (int i = 1; i <= n - l + 1; i++) { int j = i + l - 1; m[i][j] = (1 << 21); for (int k = i; k <= j - 1; k++) m[i][j] = min(m[i][j], m[i][k] + m[k + 1][j]) + p[i - 1] * p[k] * p[j]); } } cout << m[1][n] << endl; return 0; } 验证计算过程: 因此,最佳乘积序列为(A1A2)((A3A4)(A5A6)),共执行乘法2010次 写出解决部分背包问题的贪心算法。并用如下实例验证求解过程: P[]={18,12,4,1},W[]={12,10,8,3},M=25 正确答案: #include #include using namespace std; struct item{ int w;//物品的重量 int p;//物品的价值 float bi;//物品单位重量的价值 }items[MAXV]; bool cmp(const item &a,const item &b){ return a.bi>b.bi;//降序 } int main(){ int n;//n件物品 float M;//背包容量为M int maxp;//装入的最大价值 cout<<"输入物品件数和背包容量:"< cin>>n>>M; cout<<"依次输入每件物品的价值和重量:"< for(int i=0;i cin>>items[i].p>>items[i].w; items[i].bi=items[i].p/items[i].w;//计算单位重量价值 } sort(items,items+n,cmp);//按照单位重量的价值排序 int sum=0,j=0;maxp=0; for(j=0;j if(items[j].w<=M){//选择单位价值重量最大的并且不超过背包容量的 sum+=items[j].w; M-=items[j].w; maxp+=items[j].p; } else break; } if(j maxp+=M/items[j].w*items[j].p;//加上装入部分比例的物品的价值; } cout<<"装入的最大价值:"< return 0; } 流水作业调度问题的johnson算法的思想。 正确答案: ① N1={i|ai ② 将N1中作业按ai的非减序排序得到N1’,将N2中作业按bi的非增序排序得到N2’; ③ N1’中作业接N2’中作业就构成了满足Johnson法则的最优调度。