类型:软件专题
版本:V0.8
更新:2021-03-07 07:13
大小:73.5MB
系统:Android5.1.x以上
语言:简体/繁体
点击:53016 次
评论:13 条
1、若第n件物品能放入背包,则问题变为能否再从n-1件物品中选出若干件放入背包(这时
背包可放入物品的重量变为s-w[n]) 。若第n件物品不能放入背包,则考虑从n-1件物品选
若干件放入背包(这时背包可放入物品仍为s)。若最终s=0,则有一解;否则,若s<0或虽然
s>0但物品数n<1,则无解 。
(1)s-w[n],n-1 //Knap(s-w[n],n-1)=true
(2)s,n-1 // Knap←Knap(s,n-1)
2 、假设以邻接矩阵作为图的存储结构,编写算法判别在给定的有向图中是否存在一个简单有
向回路,若存在,则以顶点序列的方式输出该回路(找到一条即可)。(注:图中不存在顶点
到自己的弧)
有向图判断回路要比无向图复杂。利用深度优先遍历,将顶点分成三类:未访问;已访问但
其邻接点未访问完;已访问且其邻接点已访问完 。下面用0,1,2表示这三种状态。前面已提
到,若dfs(v)结束前出现顶点u到v的回边,则图中必有包含顶点v和u的回路。对应程
序中v的状态为1,而u是正访问的顶点,若我们找出u的下一邻接点的状态为1,就可以输
出回路了 。
void Print(int v,int start ) //输出从顶点start开始的回路。
{for(i=1;i<=n;i++)
if(g[v][i]!=0 && visited[i]==1 ) //若存在边(v,i),且顶点i的状态为1 。
{printf(“%d”,v);
if(i==start) printf(“\n”); else Print(i,start);break;}//if
void dfs(int v)
{visited[v]=1;
for(j=1;j<=n;j++ )
if (g[v][j]!=0) //存在边(v,j)
if (visited[j]!=1) {if (!visited[j]) dfs(j); }//if
else {cycle=1; Print(j,j);}
visited[v]=2;
}//dfs
void find_cycle() //判断是否有回路,有则输出邻接矩阵 。visited数组为全局变量。
{for (i=1;i<=n;i++) visited[i]=0;
for (i=1;i<=n;i++ ) if (!visited[i]) dfs(i);
}//find_cycle
3 、设指针变量p指向双向链表中结点A,指针变量q指向被插入结点B,要求给出在结点A
的后面插入结点B的操作序列(设双向链表中结点的两个指针域分别为llink和rlink)。
4 、设T是一棵满二叉树,编写一个将T的先序遍历序列转换为后序遍历序列的递归算法 。
5 、设T是一棵满二叉树,编写一个将T的先序遍历序列转换为后序遍历序列的递归算法 。
6 、(1)p->rchild (2)p->lchild (3)p->lchild (4)ADDQ(Q,p->lchild) (5)ADDQ(Q,p->rchild)
25. (1)t->rchild!=null (2)t->rchild!=null (3)N0++ (4)count(t->lchild) (5)count(t->rchild)
26. .(1)top++ (2) stack[top]=p->rchild (3)top++ (4)stack[top]=p->lchild
27. (1)*ppos // 根结点(2)rpos=ipos (3)rpos–ipos (4)ipos (5)ppos+1
7 、请设计一个算法,要求该算法把二叉树的叶子结点按从左到右的顺序连成一个单链表,表头指针为head 。二叉树按二叉链表方式存储,链接时用叶子结点的右指针域来存放单链表指针 。分析你的算法的时、空复杂度。
。