计算机算法设计与分析第四版课后答案.docx
《计算机算法设计与分析第四版课后答案.docx》由会员分享,可在线阅读,更多相关《计算机算法设计与分析第四版课后答案.docx(19页珍藏版)》请在冰豆网上搜索。
计算机算法设计与分析第四版课后答案
计算机算法设计与分析第四版课后答案
【篇一:
计算机算法分析与设计(第四版)习题算法分析部分详解(实验六)】
//6-1、6-6项目vc++6.0测试通过
//6-15项目vc2005测试通过
//6-1最小长度电路板排列问题
//头文件stdafx.h
//stdafx.h:
includefileforstandardsystemincludefiles,
//orprojectspecificincludefilesthatareusedfrequently,but
//arechangedinfrequently
//
#pragmaonce
#definewin32_lean_and_mean//excluderarely-usedstufffromwindowsheaders#includestdio.h
#includetchar.h
//todo:
referenceadditionalheadersyourprogramrequireshere
//sy61.cpp:
definestheentrypointfortheconsoleapplication.
//
//description:
//分支限界法6_1最小长度电路板排列问题
//#includemy.h
#includestdafx.h
#includeiostream
#includequeue
usingnamespacestd;
intn,m;
//#includeoutofbounds.h
//定义节点类
classboardnode{
friendintfifoboards(int**,int,int,int*);//非类成员,可以访问私有成员的函数,最优序列查找
public:
operatorint()const{returncd;}//返回常数cd
intlen();
public:
int*x,s,cd,*low,*high;//x表示当前节点的电路板排列,s表示当前节点排列好的电路板的数
//表示当前节点的最大长度,low,high分别表当前节点表示每一个连接块的第一个,和最后一个电路板
//的位置
};
//编写类的len()函数,求出当前节点的连接块长度的最大值
intboardnode:
:
len()
{
inttmp=0;
for(intk=1;k=m;k++)
if(low[k]=nhigh[k]0tmphigh[k]-low[k])
tmp=high[k]-low[k];
returntmp;
}
intfifioboards(int**b,intn,intm,int*bestx)//n为电路板的数量,m为连接块的数量{
//intbestd;
queueboardnodeq;//声明boardnode类的节点队列q
boardnodee;
e.x=newint[n+1];//为数组指针x分配n+1个动态空间,存储当前的排列
e.s=0;//最初时,排列好的电路板的数目为0
e.cd=0;
e.low=newint[m+1];//存储每个连接块的第一个电路板的位置
e.high=newint[m+1];//存储每个连接块的最后一个电路板的位置
for(inti=1;i=m;i++)
{
e.high[i]=0;//初始化开始时的每个连接块的最后一个电路板的位置为0,表示连接块i还没有电路板放入e.x的排列中
e.low[i]=n+1;//初始化开始时的每个连接块的第一个电路板的位置为n+1,表示连接块i还没有电路板放入e.x的排列中
}
for(i=1;i=n;i++)
e.x[i]=i;//初始化e.x的排列为1,2,3.....n
intbestd=n+1;//最优距离
bestx=0;//记录当前最优排列
do{
if(e.s==n-1)//当已排列了n-1个时
{
//判断是否改变每个连接块的最后一个电路板的位置
for(intj=1;j=m;j++)
if(b[e.x[n]][j]ne.high[j])
e.high[j]=n;
intld=e.len();//存储当前节点的各连接块长度中的最大长度
//如果当前的最大长度小于了n+1
if(ldbestd)
{
delete[]bestx;
bestx=e.x;
bestd=ld;//最优距离
}
elsedelete[]e.x;//删除分配给e.x的数组空间
delete[]e.low;//删除分配给e.low的数组空间
delete[]e.high;//删除分配给e.high的数组空间
}
else
{
intcurr=e.s+1;//rr记录现在应该排列第几个电路板
for(inti=e.s+1;i=n;i++)//处理扩展节点下一层所有子节点
{
boardnoden;
n.low=newint[m+1];//与if中的意思相同
n.high=newint[m+1];
for(intj=1;j=m;j++)
{
n.low[j]=e.low[j];//将e.low[]中的值赋给n.low[]
n.high[j]=e.high[j];
if(b[e.x[i]][j])
{
if(currn.low[j])
n.low[j]=curr;//若当前节点连接块j的第一个电路板的位置比现在正在排列的电路板的位置还小
if(currn.high[j])
n.high[j]=curr;
}
}
n.cd=n.len();
//如果,当前节点的最大长度小于了最优长度则:
if(n.cdbestd)
{
n.x=newint[n+1];
n.s=e.s+1;
for(intj=1;j=n;j++)
n.x[j]=e.x[j];
n.x[n.s]=e.x[i];//交换位置
n.x[i]=e.x[n.s];//交换位置
q.push(n);//将节点n加入队列中
}
else
{
delete[]n.low;
delete[]n.high;
}
//printf(%d,bestd);
}
delete[]e.x;//当前扩展节点所有子节点均考虑,变成死结点}
//try{
if(!
q.empty()){
e=q.front();//取队列首节点作为扩展节点
q.pop();
}elsereturnbestd;
//}
//catch(outofbounds)
//{
//returnbestd;
//}
//printf(finish);
}while(!
q.empty());
returnbestd;
return1;
}
//测试
voidmain()
{
//scanf(%d%d,n,m);
cinnm;
int**b=newint*[n+1];
for(intt=0;t=n;t++)
b[t]=newint[m+1];
for(inti=1;i=n;i++)
for(intj=1;j=m;j++)
cinb[i][j];
//scanf(%d,b[i][j]);
int*bestx=newint[n+1];
intbestd=0;
bestd=fifioboards(b,n,m,bestx);
printf(%d\n,bestd);
for(i=1;i=n;i++){
coutbestx[i];
}
coutendl;
}
//6-6经典n皇后问题
//description:
经典n皇后问题广度优先建议n=14解空间为子集树//参考答案说排列树是不正确的,本例打印n*n棋盘的所有解,即放置方法#includeiostream
#includefstream
#includealgorithm
#includefunctional
#includequeue
usingnamespacestd;
//本例子直接输入棋盘大小,不用文件
//ifstreamin(input.txt);//请在项目文件夹下新建一个input.txt
//ofstreamout(output.txt);
classnode{
public:
node(intn){
t=0;
this-n=n;
loc=newint[n+1];
for(inti=0;i=n;++i)
{
loc[i]=0;
}
}
node(constnodeother){
this-t=other.t;
this-n=other.n;
this-loc=newint[n+1];
for(inti=0;i=n;++i){
this-loc[i]=other.loc[i];
}
}
intt;//已放置t个皇后
【篇二:
计算机算法分析与设计(第四版)习题算法分析部分详解(实验二)】
>实验内容:
算法实现问题2-1、2-5、2-7
//2-1众数问题
思路1:
先排序,然后再统计,时间复杂度较高。
思路2:
递归实现
–先根据某数x,将小于x的放于其左,大于x的放于其右
–统计x出现的次数t
–如果x左边数的个数t,向左递归
–如果x右边数的个数t,向右递归
#includeiostream
#includecstdlib
#includefstream
#includemap
usingnamespacestd;
intkey;
intmaxcount=0;
voidzs(int*a,intl,intr){
intnum=a[l];
intan=0;
int*b=newint[r-l+1];
intbn=0;
int*c=newint[r-l+1];
intcn=0;
for(inti=l;i(r-l+1);i++){
if(num==a[i]){
an++;
}elseif(numa[i]){
b[bn]=a[i];
bn++;
}else{
c[cn]=a[i];
cn++;
}
if(anmaxcount){
key=a[i];
maxcount=an;
}
}
if(bnmaxcount){//小于部分
zs(b,0,bn-1);
}
if(cnmaxcount){//大于部分
zs(c,0,cn-1);
}
deleteb;
deletec;
}
intmain()
{
ifstreaminputfile(input.txt,ios:
:
in);//读数据文件
ofstreamoutputfile(output.txt,ios:
:
out);//写数据文件
if(!
inputfile)
{
cerrinputfilecouldnotbeopened.endl;
exit
(1);
}
intnumber;
inputfilenumber;
intl=0,r=number-1;
int*a=newint[number];
inti=0;
while(inputfilenumber){//使用c++文件输入流输入数据
a[i]=number;
i++;
}
zs(a,l,r);//众数问题递归函数
deletea;
outputfilekeyendlmaxcount;//使用c++文件输出流输出结果
return0;
}
//将nput.txt、output.txt文件放在项目文件夹下,分别存储输入数据和结果
例如:
项目名sy21
//算法实现题:
2-5
思路:
回溯法搜索排列树,相同元素不交换位置,修复前后紧邻相同元素问题
#includeiostream.h
templateclasstype
voidperm(typelist[],intk,intm)
{//产生list[k:
m]的所有排列
if(k==m)
{//只剩下1个元素
for(inti=0;i=m;i++)coutlist[i];
coutendl;
}
else//还有多个元素待排列,递归产生排列
for(inti=k;i=m;i++)
{
if((list[k]==list[i])(k!
=i)||(list[i]==list[i-1])){
continue;
}
swap(list[k],list[i]);
perm(list,k+1,m);
swap(list[k],list[i]);
}
}
templateclasstype
inlinevoidswap(typea,typeb)
{
typetemp=a;a=b;b=temp;
}
voidmain(){
chara[4]={a,b,c,a};
perm(a,0,3);
}
//集合划分问题2-7
思路:
对于n个元素的集合,可以划分成由m(1=m=n)个子集构成的子集,如{{1},{2},{3},{4}}就是由4个子集构成的非空子集。
假设f(n,m)表示将n个元素的集合划分成由m个子集构成的集合的个数,那么可以这样来看:
1)若m==1,则f(n,m)=1;
2)若n==m,则f(n,m)=1;
3)若非以上两种情况,f(n,m)可以由下面两种情况构成
a.向n-1个元素划分成的m个集合里面添加一个新的元素,则有m*f(n-1,m)种方法;
b.向n-1个元素划分成的m-1个集合里添加一个由一个元素形成的独立的集合,则有f(n-1,m-1)种方法。
?
?
m?
?
1||n?
?
m?
?
1f(n,m)?
?
?
?
f?
n?
1,m?
1?
?
m*f?
n?
1,m?
?
m?
nm!
?
1?
//参考代码
#includestdio.h
intf(intn,intm)
{
if(m==1||n==m)
return1;
else
returnf(n-1,m-1)+f(n-1,m)*m;
}
intmain(void)
{
intn;
while(scanf(%d,n)==1n=1)//按ctrl+break退出程序
{
inti;
intsum=0;
for(i=1;i=n;i++)
{
sum+=f(n,i);
}
printf(%d\n,sum);
}
return0;
}
【篇三:
2013《计算机算法设计与分析》习题及答案】
ass=txt>2013秋
《计算机算法设计与分析》习题及答案
一.选择题
1、二分搜索算法是利用(a)实现的算法。
a、分治策略b、动态规划法c、贪心法d、回溯法
2、下列不是动态规划算法基本步骤的是(a)。
a、找出最优解的性质b、构造最优解c、算出最优解d、定义最优解
3、最大效益优先是(a)的一搜索方式。
a、分支界限法b、动态规划法c、贪心法d、回溯法
4、在下列算法中有时找不到问题解的是(b)。
a、蒙特卡罗算法b、拉斯维加斯算法c、舍伍德算法d、数值概率算法
5.回溯法解旅行售货员问题时的解空间树是(a)。
a、子集树b、排列树c、深度优先生成树d、广度优先生成树
6.下列算法中通常以自底向上的方式求解最优解的是(b)。
a、备忘录法b、动态规划法c、贪心法d、回溯法
7、衡量一个算法好坏的标准是(c)。
a运行速度快b占用空间少c时间复杂度低d代码短
8、以下不可以使用分治法求解的是(d)。
a棋盘覆盖问题b选择问题c归并排序d0/1背包问题
9.实现循环赛日程表利用的算法是(a)。
a、分治策略b、动态规划法c、贪心法d、回溯法
10、下列随机算法中运行时有时候成功有时候失败的是(c)
a数值概率算法b舍伍德算法c拉斯维加斯算法d蒙特卡罗算法
11.下面不是分支界限法搜索方式的是(d)。
a、广度优先b、最小耗费优先c、最大效益优先d、深度优先
12.下列算法中通常以深度优先方式系统搜索问题解的是(d)。
a、备忘录法b、动态规划法c、贪心法d、回溯法
13.备忘录方法是那种算法的变形。
(b)
a、分治法b、动态规划法c、贪心法d、回溯法
14.哈夫曼编码的贪心算法所需的计算时间为(b)。
a、o(n2n)b、o(nlogn)c、o(2n)d、o(n)
15.分支限界法解最大团问题时,活结点表的组织形式是(b)。
a、最小堆b、最大堆c、栈d、数组
16.最长公共子序列算法利用的算法是(b)。
a、分支界限法b、动态规划法c、贪心法d、回溯法
17.实现棋盘覆盖算法利用的算法是(a)。
a、分治法b、动态规划法c、贪心法d、回溯法
18.下面是贪心算法的基本要素的是(c)。
a、重叠子问题b、构造最优解c、贪心选择性质d、定义最优解
19.回溯法的效率不依赖于下列哪些因素(d)
a.满足显约束的值的个数b.计算约束函数的时间
c.计算限界函数的时间d.确定解空间的时间
)
a.递归函数b.剪枝函数c。
随机数函数d.搜索函数
21、下面关于np问题说法正确的是(b)
anp问题都是不可能解决的问题bp类问题包含在np类问题中
cnp完全问题是p类问题的子集dnp类问题包含在p类问题中
22、蒙特卡罗算法是(b)的一种。
a、分支界限算法b、概率算法c、贪心算法d、回溯算法
23.下列哪一种算法不是随机化算法(c)
a.蒙特卡罗算法b.拉斯维加斯算法c.动态规划算法d.舍伍德算法
24.(d)是贪心算法与动态规划算法的共同点。
a、重叠子问题b、构造最优解c、贪心选择性质d、最优子结构性质
25.矩阵连乘问题的算法可由(b)设计实现。
a、分支界限算法b、动态规划算法c、贪心算法d、回溯算法
26.分支限界法解旅行售货员问题时,活结点表的组织形式是(a)。
a、最小堆b、最大堆c、栈d、数组
27、strassen矩阵乘法是利用(a)实现的算法。
a、分治策略b、动态规划法c、贪心法d、回溯法
29、使用分治法求解不需要满足的条件是(a)。
a子问题必须是一样的b子问题不能够重复
c子问题的解可以合并d原问题和子问题使用相同的方法解
30、下面问题(b)不能使用贪心法解决。
a单源最短路径问题bn皇后问题c最小生成树问题d背包问题
31、下列算法中不能解决0/1背包问题的是(a)
a贪心法b动态规划c回溯法d分支限界法
32、回溯法搜索状态空间树是按照(c)的顺序。
a中序遍历b广度优先遍历c深度优先遍历d层次优先遍历
33、下列随机算法中运行时有时候成功有时候失败的是(c)
a数值概率算法b舍伍德算法c拉斯维加斯算法d蒙特卡罗算法
34.实现合并排序利用的算法是(a)。
a、分治策略b、动态规划法c、贪心法d、回溯法
35.下列是动态规划算法基本要素的是(d)。
a、定义最优解b、构造最优解c、算出最优解d、子问题重叠性质
36.下列算法中通常以自底向下的方式求解最优解的是(b)。
a、分治法b、动态规划法c、贪心法d、回溯法
37.采用广度优先策略搜索的算法是(a)。
a、分支界限法b、动态规划法c、贪心法d、回溯法
38、合并排序算法是利用(a)实现的算法。
a、分治策略b、动态规划法c、贪心法d、回溯法
39、在下列算法中得到的解未必正确的是(b)。
a、蒙特卡罗算法b、拉斯维加斯算法c、舍伍德算法d、数值概率算法
40、背包问题的贪心算法所需的计算时间为(b)
a、o(n2n)b、o(nlogn)c、o(2n)d、o(n)
41.实现大整数的乘法是利用的算法(c)。
a、贪心法b、动态规划法c、分治策略d、回溯法
42.0-1背包问题的回溯算法所需的计算时间为(a)
na、o(n2)b、o(nlogn)c、o(2n)d、o(n)
43.采用最大效益优先搜索方式的算法是(a)。
a、分支界限法b、动态规划法c、贪心法d、回溯法
44.贪心算法与动态规划算法的主要区别是(b)。
a、最优子结构b、贪心选择性质c、构造最优解d、定义最优解
45.实现最大子段和利用的算法是(b)。
a、分治策略b、动态规划法c、贪心法d、回溯法
46.优先队列式分支限界法选取扩展结点的原则是(c)。
a、先进先出b、后进先出c、结点的优先级d、随机
47.背包问题的贪心算法所需的计算时间为(b)。
nna、o(n2)b、o(nlogn)c、o
(2)d、o(n)
48、广度优先是(a)的一搜索方式。
a、分支界限法b、动态规划法c、贪心法d、回溯法
49、舍伍德算法是(b)的一种。
a、分支界限算法b、概率算法c、贪心算法d、回溯算法
50下列哪一种算法是随机化算法(d)
a.贪心算法b.回溯法c.动态规划算法d.舍伍德算法
51.一个问题可用动态规划算法或贪心算法求解的关键特征是问题的(b)。
a、重叠子问题b、最优子结构性质c、贪心选择性质d、定义最优解
52.采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为(b)。
nna、o(n2)b、o(nlogn)c、o
(2)d、o(n)
53.以深度优先方式系统搜索问题解的算法称为(d)。
a、分支界限算法b、概率算法c、贪心算法d、回溯算法
54.实现最长公共子序列利用的算法是(b)。
a、分治策略b