算法分析与设计教程习题答案(修订版)-秦明

 算法分析与设计教程习题答案(修订版)-秦明
 算法分析与设计教程习题答案(修订版)-秦明

算法分析与设计教程

习题解答

第1章 算法引论

1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。 频率计数是指计算机执行程序中的某一条语句的执行次数。

多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。 指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。

2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促

使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。

3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事

后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。

4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复

杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。

5. 解:①n=11; ②n=12; ③n=982; ④n=39。

第2章 递归算法与分治算法

1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。

2. 解:通过分治算法的一般设计步骤进行说明。 3. 解:int fibonacci(int n) {

if(n<=1) return 1;

return fibonacci(n-1)+fibonacci(n-2); }

4. 解:void hanoi(int n,int a,int b,int c) {

if(n>0) {

hanoi(n-1,a,c,b); move(a,b);

hanoi(n-1,c,b,a); } } 5. 解:①

22*2)(--=n n f n

② )log *()(n n n f O =

6. 解:算法略。时间复杂度分析:设时间复杂度为T (n ),则

因此,T(n )≤2T(n-1)≤22

T(n-2)≤···≤2n-1

T(1)=)2(n O 。

7. 解:后序遍历二叉树的非递归算法如下: typedef struct{ BiTree link; int flag; }Stacktype;

void NRpostOrder(BiTree b){

Stacktype Stack[MAX_TREE_SIZE]; BiTree p; int top,sign;

if(b==NULL) return;

top=-1; /*栈顶位置初始化*/ p=b;

while(!(p==NULL&&top==-1)){

if(p!=NULL){ /*结点第一次进栈*/ Stack[++top].link=p; Stack[top].flag=1;

p=p->lchild; /*找该结点的左孩子*/ } else{

p=Stack[top].link; sign=Stack[top--].flag;

if(sign==1){ /*结点第二次进栈*/

Stack[++top].link=p;

Stack[top].flag=2; /*标记第二次出栈*/ p=p->lchild; } else{

Visit(p->data); /*访问该结点数据域值*/ p=NULL; } } } }

8. 解:第一趟排序后数组中的元素排列为37、35、38、36、47、53、65、73; 第二趟排序后数组中的元素排列为36、35、37、38、47、53、65、73; 第三趟排序后数组中的元素排列为35、36、37、38、47、53、65、73; 第四趟排序后数组中的元素排列为35、36、37、38、47、53、65、73;

0)2()1()(>≤??

??

?

-+-=n n n T n T C n T

第五趟排序后数组中的元素排列为35、36、37、38、47、53、65、73;

第六趟排序后数组中的元素排列为35、36、37、38、47、53、65、73;

第七趟排序后数组中的元素排列为35、36、37、38、47、53、65、73;

第八趟排序后数组中的元素排列为35、36、37、38、47、53、65、73。9.解:①原数组是有序的;

②n*(n-1)/2。

10.解:(略)思路同第8题。

11.解:void maxmin(int A[],int &e_max,int low,int high)

{

int mid,x1,y1,x2,y2;

if((high-low)<=1){

if(A[high]>A[low]){

e_max=A[high];

e_min=A[low];

}

else{

e_max=A[low];

e_min=A[high];

}

}

else{

mid=(low+high)/2;

maxmin(A,x1,y1,low,mid);

maxmin(A,x2,y2,mid+1,high);

e_max=max(x1,x2);

e_min=min(x1,x2);

}

}

12. 解:void poly_product(float p[],float q[],float r0[],int n)

{

int k,i;

float *r1,*r2,*r3;

r1=new float[2*n-1];

r2=new float[2*n-1];

r3=new float[2*n-1];

for(i=0;i<2*n-1;i++)

r0[i]= r1[i]=r2[i]=r3[i]=0;

if(n==2)

product(p,q,c);

else{

k=n/2;

poly_product(p,q,r0,k);

poly_product(p+k,q+k,r1+2*k,k);

plus(p,p+k,r2+k,k);

plus(q,q+k,r3,k);

poly_product(r2+k,r3,r2+k,k);

mins(r2+k,r0,2*k-1);

mins(r2+k,r1+2*k,2*k-1);

plus(r0+k,r2+k,r0+k,2*k-1);

plus(r0+2*k,r1+2*k,r0+2*k,2*k-1);

}

delete r1;

delete r2;

delete r3;

}

void product(float p[],float q[],float c[])

{

c[0]=p[0]*q[0];

c[2]=p[1]*q[1];

c[1]=(p[0]+p[1])*(q[0]+q[1])-c[0]-c[2];

}

void plus(float p[],float q[],float c[],int n)

{

int i;

for(i=0;i

c[i]=p[i]+q[i];

}

void mins(float p[],float q[],int n)

{

int i;

for(i=0;i

p[i]=p[i]-q[i];

}

第3章贪心算法

1.解:(1)最优解的序列为(1,2/3,1,0,1,1,1);

FO(I)=10+2/3*5+15+6+18+3=166/3;

按Pi的非增次序输入时的序列为(1,0,1,4/7,0,1,0);

FG(I)=10+15+4/7*7+18=47;

因此,FO(I)/FG(I)=166/141;

(2)按wi的非降次序列输入时的序列为(1,1,4/5,0,1,1,1);

此时的背包问题解为FG*(I)=10+5+4/5*15+6+18+3=54;

因此,FO(I)/FG*(I)=83/81。

2.解:举一个反例如下:

设背包容量为13,有7件物品,它们的容量组成的向量为(1,2,4,5,3,3,7),它

们的效益值组成的向量为(6,10,18,14,8,7,7)。

按照贪心算法计算求解总效益值为6+10+18+14=48,此时物品的总容量为

1+2+4+5=12≤13;可是按照6+10+18+8+7=49,此时物品的总容量为1+2+4+3+3=13

亦没有超过背包容量13,由于总效益值48<49,因此该策略在这种情况下得不到

最优解。

3.解:

#include

using namespace std;

const int N=12;

void OutputResult(int Select[N])

{

cout<<”{0”;

for(int i=1;i

if(Select[i]==1)

cout<<”,”<

cout<<’}’<

}

int main()

{

int Begin[N]={1,3,0,3,2,5,6,4,10,8,15,15};

int End[N]={3,4,7,8,9,10,12,14,15,18,19,20};

int Select[N]={0,0,0,0,0,0,0,0,0,0,0,0};

int i=0;

int TimeStart=0;

while(i

{

if(Begin[i]>=TimeStart)

{

Select[i]=1;

TimeStart=End[i];

}

i++;

}

OutputResult(Select);

result 0;

}

4.解题思路提示如下:

连接法:将间距较小的相邻区间连接成一个大的新区间,然后将所得的几个新区间的距离相加继而求得最小长度。

5.解:

class JobNode{

friend void Greedy(JobNode *,int,int);

friend void main(void);

public:

operator int()const{return time;}

private:

int ID,time;

};

class MachineNode{

friend void Greedy(JobNode *,int,int);

public:

operator int()const{return avail;}

private:

int ID,avail;

};

template

void Greedy(Type a[],int n,int m)

{ if(n<=m){

cout<<“为每个作业分配一台机器。”<

return;

}

Sort(a,n);

MinHeapH(m);

MachineNode x;

for(int i=1;i<=m;i++){

x.avail=0;

x.ID=i;

H.Insert(x);

}

for(int i=n;i>=1;i--){

H.DeleteMin(x);

cout<<“将机器”<

<<(x.avail+a[i].time)<<“的时间段分配给作业”<

H.Insert(x);

}

}

6.解:

#include

#include

using namespace std;

void deleteS(char *p)

{

while(*p)

{

*p = *(p+1);

p++;

}

}

int main()

{

char S[240];

int i,m;

cout <<"请输入数字串:"<

cin >> S;

cout <<"请输入须删掉多少个数:N"<

do {

cout <<"0 < N <数字串的长度" <

cin >> m;

} while( m<0 || m >= (int)strlen(S) );

while(m>0)

{

i = 0;

while( i<(int)strlen(S) &&(S[i]<=S[i+1]) )

i++;

deleteS(&S[i]);

m--;

}

/*删除S串中高位的0*/;

while(S[0]=='0') deleteS(&S[0]);

if ( strlen(S)!=0 )

cout << S <

else

cout << ‘0’ <

return 0;

}

7.解:

#include

#include

using namespace std;

#define maxn 1005

struct POINT

{

double l,r;

};

double x[maxn],y[maxn];

POINT points[maxn];

int can,ans,n,d,mk[maxn];

int comp(const void *a,const void *b) /*线段排序比较函数*/

{

POINT *aa,*bb;

aa=(POINT *)a; bb=(POINT *)b; /*强制类型转换*/

if(aa->r-bb->r<1e-8&&bb->r-aa->r<1e-8)/*aa的右端点与bb的右端点相同*/ return 0;

if(aa->rr) /*aa的右端点在bb的右端点右边*/

return -1;

return 1; /*aa的右端点在bb的右端点左边*/

}

void init() /*输入与初始化*/

{

int i;

for(can=1,i=0;i

{

cin>>x[i]>>y[i]; /*输入岛屿i的坐标*/

if(d+1e-8>y[i]) /*如果岛屿i在雷达监控范围内,计算海岸线上

对应的雷达安装区域*/

{

points[i].l=x[i]-sqrt(double(d)*d-y[i]*y[i]);

points[i].r=x[i]+sqrt(double(d)*d-y[i]*y[i]);

}

else can=0;

}

}

void solve()

{

int i,j;

qsort(points,n,sizeof(POINT),comp); /*将各岛屿按在海岸线的可安装雷达区

域右端大小排序*/

for(i=0;i

for(ans=0,i=0;i

if(!mk[i])

{

mk[i]=1; /*进行贪心策略选择*/

ans++;

for(j=i+1;j

if((!mk[j])&&(points[j].l<=points[i].r+1e-8))

mk[j]=1;

}

}

int main()

{

int caseno=0;

while(cin>>n>>d,(n>0||d>0))

{

cout<<"Case"<<++caseno<<":";

init();

if(!can)

cout<<-1<

else

{

solve();

cout<

}

}

return 0;

}

第4章动态规划算法

1.解:最短路径为0->1->6->7->9,路径长度为17。

2.解:

最后的决策结果:分配给第一、第二、第三工程的资源份额依次是1份、1份、2份。3.解:cbaab。求解过程略。

4. 解:应选择中间4个物品,即重量分别为3,7,2,3;效益值分别为6,5,4,3的物品。求解过程略。

5.解:

#include

using namespace std;

const int MAXN=100;

int n,r[MAXN][MAXN], m[MAXN][MAXN],s[MAXN][MAXN];

int money(int i,int j)

{

int k,tmp=0,u;

if(i==j) return 0;

if(i+1==j)

{

s[i][j]=i;

return m[i][j];

}

u=m[i][j];

s[i][j]=i;

for(k=i+1;k

{

tmp=money(i,k)+money(k,j);

if(tmp

{

u=tmp;

s[i][j]=k;

}

}

return u;

}

int main()

{

int i,j,num=0,a;

while(cin>>n)

{

if(n==0) break;

else

{

num++;

cout<<"Case"<

for(i=0;i

for(j=i+1;j<=n;j++)

{

cin>>a;

r[i][j]=a;

if(a==-1)

r[i][j]=65535;

m[i][j]=r[i][j];

};

money(0,n);

cout<< money(0,n)<

}

}

return 0;

}

6.求解思路:设所给的两个字符串分别为A=A[1..m]和B=B[1..n]。

状态表示:考虑从字符子串A=A[1..i](按序)变换到字符子串B[1..j]的最少字符操作问题,有d(i,j)=δ(A[1..i],B[1..j])。显然,2个单字符a、b之间的编辑距离:当a≠b时,为δ(a,b)=1;当a=b时,为δ(a,b)=0。问题的解为d(m,n)。

根据最优子结构性质,建立下面的状态转移方程:

d(i,j)=min{d(i-1,j-1)+ (A[i],B[j]),d(i-1,j)+1,d(i,j-1)+1} 初始条件为:d(i,0)=i,i=0~m;d(0,j)=j,j=0~n。

问题的解为d(m,n)。

7.解:

#include "cstdio"

#include "iostream"

#include "string"

using namespace std;

int Min(int a,int b)

{

return a>b?b:a;

}

char pp(char c1,char c2)

{

if((c1=='['&&c2==']')||(c1=='('&&c2==')'))

return c2;

else

return 0;

}

char* change(char c)

{

if(c=='[' || c==']')

return "[]";

if(c=='('|| c==')')

return "()";

return 0;

}

char* scat(const char *s1,char *s2)

{

char *s=(char*)calloc(strlen(s1)+strlen(s2)+1,sizeof(char));

strcpy(s,s1);

strcat(s,s2);

return s;

}

char* ctos(char c)

{

char* s=(char*)calloc(2,sizeof(char));

s[0]=c;

s[1]='\0';

return s;

}

int main(void)

{

int n,i,j,l,k;

int **m;

char *str,***regs;

printf("请输入括号个数: ");

scanf("%d",&n);

m=(int**)calloc(n+1,sizeof(int*));

regs=(char***)calloc(n+1,sizeof(char**));

for(i=0;i<=n;++i)

{

m[i]=(int*)calloc(n+1,sizeof(int));

regs[i]=(char**)calloc(n+1,sizeof(char*));

for(j=0;j<=n;++j)

{

regs[i][j]=(char*)calloc(2*n,sizeof(char));

}

}

fflush(stdin);

str=(char*)calloc(n+1,sizeof(char));

printf("请输入以( )和[ ]组合的括号串: ");

for(i=0;i

scanf("%c",&str[i]);

str[n]='\0';

printf("原串: %s\n",str);

for(l=1;l<=n;++l)

{

for(i=0;i<=n-l;++i)

{

j=i+l-1;

int min=l,w=-1;

for(k=i+1;k<=j;++k)

{

if((pp(str[i],str[k])!=0) && (min>m[i+1][k-1]+m[k+1][j]))

//i与哪个k正真匹配

{

min=m[i+1][k-1]+m[k+1][j];

w=k;

}

}

if(w!=-1)

{

m[i][j]=min;

strcpy(regs[i][j],scat(scat(scat(ctos(str[i]),regs[i+1][w-1]),ctos(pp(str[i ],str[w]))),regs[w+1][j]));

}

else

{

m[i][j]=Min(min,1+m[i+1][j]); //i没有匹配的

strcpy(regs[i][j],scat(change(str[i]),regs[i+1][j]));

}

}

}

printf("最少添加数: %d\n正则括号序列: %s\n",m[0][n-1],regs[0][n-1]);

return 0;

}

8.求解思路:输入表示成两个长度为L的数组color和len

–L表示有多少“段”不同的颜色方块

–color[i]表示第i段的颜色

–len[i]表示第i段的方块长度

题目的例子成color={1,2,3,1}, len={1,4,3,1}

用(i,j,k)表示在第i~j段方块的右边添加k个颜色为color[j]的方块后得到的方块序列, 相当于考虑第i~j段, 但让len[j]的值增加k。

d[i,j,k]表示把序列(i,j,k)消除的最大得分

考虑最后一段,有两类决策

①如果马上消掉,就是d[i,j-1,0]+(len[j]+k)2;

②如果和前面的若干段一起消,设这“若干段”中最后面的那一段是p(i<=p

边界条件是f [i,i-1,0]=0。

第5章回溯算法

1.解:

class Flowshop{

friend Flow(int * *,int,int[])

private:

void Backtrack(int i);

int * * M, /*各作业所需的处理时间*/

*x, /*当前作业调度*/

*bestx, /*当前最优作业调度*/

*f2, /*机器2完成处理的时间*/

f1, /*机器1完成处理的时间*/

f, /*完成时间和*/

bestf, /*当前最优值*/

n; /*作业数*/

};

void Flowshop::Backtrack(int i)

{

if(i>n){

for(int j=1;j<=n;j++)

bestx[j]=x[j];

bestf=f;

}

else

for(int j=i;j<=n;j++){

f1+=M[x[j]][1];

f2[i]=((f2[i-1]>f1)?f2[i-1]:f1)+M[x[j]][2]; f+=f2[i];

if(f

Swap(x[i],x[j]);

Backtrack(i+1);

Swap(x[i],x[j]);

}

f1-=M[x[j]][1];

f-=f2[i];

}

}

int Flow(int * * M,int n,int bestx[])

{

int ub=INT_MAX;

Flowshop X;

X.x=new int[n+1];

X.f2=new int[n+1];

X.M=M;

X.n=n;

X.bestx=bestx;

X.bestf=ub;

X.f1=0;

X.f=0;

for(int i=0;i<=n;i++)

X.f2[i]=0,X.x[i]=i;

X.Backtrack(1);

delete[]X.x;

delete[]X.f2;

return X.bestf;

}

2.解:

class Color{

friend int mColoring(int,int,int * *);

private:

bool Ok(int k);

void Backtrack(int t);

int n, /*图的顶点数*/

m, /*可用颜色数*/

* * a; /*图的邻接矩阵*/

* x, /*当前解*/

long sum; /*当前已找到的可m着色方案数*/ };

bool Color::Ok(int k) /*检查颜色可用性*/

{

for(int j=1;j<=n;j++)

if((a[k][j]==1)&&(x[j]==x[k])

return false;

return true;

}

void Color::Backtrack(int t)

{

if(t>n){

sum++;

for(int i=1;i<=n;i++)

cout<

cout<

}

else

for(int i=1;i<=m;i++){

x[t]=i;

if(Ok(t))

Backtrack(t+1);

x[t]=0;

}

}

int mColoring(int n,int m,int * *a)

{

Color X;

X.n=n; /*初始化X*/

X.m=m;

X.a=a;

X.sum=0;

int *p=new int[n+1];

for(int i=0;i<=n;i++)

p[i]=0;

X.x=p;

X.Backtrack(1);

delete[]p;

return X.sum;

}

3.解:

class Stamp{

friend int MaxStamp(int,int,int[]);

private:

void Backtrack(int i,int r);

int n, /*邮票面值数*/

m, /*每张信封最多允许贴的邮票数*/ maxvalue, /*当前最优值*/

maxint, /*大整数*/

maxl, /*邮资上界*/

*x, /*当前解*/

*y, /*贴出各种邮资所需最少邮票数*/ *bestx; /*当前最优解*/

};

void Stamp::Backtrack(int i,int r)

{

for(int j=0;j<=x[i-2]*(m-1);j++)

if(y[j]

for(int k=1;k<=my[j];k++)

if(y[j]+k

y[j+x[i-1]*k]=y[j]+k;

while(y[r]

r++;

if(i>n){

if(r-1>maxvalue){

maxvalue=r-1;

for(int j=1;j<=n;j++)

bestx[j]=x[j];

}

int *z=new int[maxl+1];

for(int k=1;k<=maxl;k++)

z[k]=y[k];

for(int j=x[i-1]+1;j<=r;j++){

x[i]=j;

Backtrack(i+1,r)

for(int k=1;k<=maxl;k++)

y[k]=z[k];

}

delete []z;

}

}

int MaxStamp(int n,int m,int bestx[])

{

Stamp X;

int maxint=32767;

int maxl=1500;

X.n=n;

X.m=m;

X.maxvalue=0;

X.maxint=maxint;

X.maxl=maxl;

X.bestx=bestx;

X.x=new int[n+1];

X.y=new int[maxl+1];

for(int i=0;i<=n;i++)

X.x[i]=0;

for(int i=1;i<=maxl;i++)

X.y[i]=maxint;

X.x[1]=1;

X.y[0]=0;

X.Backtrack(2,1);

delete[]X.x;

delete[]X.y;

return X.maxvalue;

}

4.解:(八皇后问题解法)

#include

using namespace std;

const int Normalize=9;

int Num;

int q[9];

bool C[9];

bool L[17];

bool R[17];

void Try(int i)

{

int k;

for(int j=1;j<=8;j++)

{

if((C[j]==true)&&(L[i-j+Normalize]==true)&&(R[i+j])==true) {

q[i]=j;

C[j]=false;

L[i-j+Normalize]=false;

R[i+j]=false;

if(i<8)

{

Try(i+1);

}

else

{

Num++;

cout<<"方案"<

for(k=1;k<=8;k++)

cout<

cout<

}

C[j]=true;

L[i-j+Normalize]=true;

R[i+j]=true;

}

}

}

int main()

{

int i;

Num=0;

for(i=0;i<9;i++)

C[i]=true;

for(i=0;i<17;i++)

L[i]=R[i]=true;

Try(1);

return 0;

}

5.解:

#include

using namespace std;

#define MAX 200

#define MAXN 20

int b[MAXN];

int n,m,k,cm,cn; /*cn是当前剩余个数,cm是当前剩余数值*/ int comp(const void *a,const void *b) /*快速排序比较函数*/

{

return *(int *)b-*(int *)a;

}

void NonRecursComput() /*迭代回溯算法主要程序*/

{

int lev=0,t,a[MAX],x[MAXN];

bool flag=0;

x[0]=-1;

while(lev>=0)

{

x[lev]=x[lev]+1;

if(x[lev]==k) /*下标到最后,回溯*/

{

lev--;

cm+=a[lev];

cn++;

}

else

{

if((cm>=b[x[lev]])&&(cn>0)) /*如(cm>=b[x[lev]]≥0,则尝试再用b[x[lev]]

作为一个和项*/

{

a[lev]=b[x[lev]];

cm-=a[lev];

cn--;

if((cm==0)&&(cn>=0)) /*已满足要求*/

{

cout<<"Possible!"<

return;

}

t=x[lev];

lev++;

if(cm-b[t]<0) x[lev]=t; /*重新设置起点位置*/

else x[lev]=t-1;

}

if((cn<0)&&(cm>0))

{

lev=-1;

break;

}

}

}

if(lev==-1) /*回溯到根部又无路可走,则无解*/ cout<<"Impossible!"<

return;

}

int main()

{

int i,cnt=1,mincn;

while(cin>>m>>n>>k)

{

if(n==0||m==0)

break;

if((n>0)&&(m>0))

{

cout<<"Case"<

for(i=0;i

cin>>b[i];

qsort(b,k,sizeof(int),comp); /*对k个数进行从大到小的排序*/

cm=m,cn=n;

mincn=int(cm/b[0]); /*确定所需数的个数下界*/

if((mincn>cn)||(cn*b[0]

cout<<"Impossible!"<

else NonRecursComput();

}

}

return 0;

}

6.解:

#include

using namespace std;

#define MAXN 65535

struct node /*结点结构*/

{

int left,right; /*left、right分别记录当前结点通过添0、添1而得到的序列*/ int visited;/*标记是否被访问到,-1表示未访问过,0表示左支,1表示右支*/ };

typedef node NODE;

NODE p[MAXN]; /*表示结点数组*/

long maxb,a[MAXN]; /*数组a存放最优解*/

int m;

void init(int m) /*初始化,构建一个有向图*/

{

long i,k;

maxb=(1<

for(i=0;i<=maxb;i++)

{

p[i].left=-1; /*设定无左右孩子、无访问标记*/

p[i].right=-1;

p[i].visited=-1;

k=i; /*考察当前十进制数是i的结点的左右孩子生成情况*/ k=(k<<1)&maxb; /*结点的二进制数尾部添0,用位操作取后m位*/

if(k!=i)

p[i].left=k; /*去除重复结点-左支*/

k=k+1; /*尝试右支*/

if(k!=i)

p[i].right=k; /*去除重复结点-右支*/

}

生物优化设计答案

生物优化设计答案 Revised by BETTY on December 25,2020

生物优化设计答案 第一节人类的食物快乐预习感知 一蛋白质糖类脂肪维生素无机盐糖类脂肪蛋白质 二1.最主要薯类2.储备肉类植物油3.生长发育瘦肉奶豆类三﹪~70﹪2.钙、磷血红蛋白3.水溶性脂溶性轻松尝试应用1~6DDAABA7(1)A、B(2)C(3)含碘的无机盐(4)糖类、脂肪和蛋白质 能力提升1~14BBDDADCCCCCACB15(1)ADC(2)贫血(3)B16(1)富病主要是由缺乏维生素B1引起的。富病中还有一种称为“神经炎”的疾病。食物疗法是应尽可能多吃一些穷人吃的东西,如新鲜蔬菜、糙米等。(2)穷病主要是由缺乏维生素A引起的,“雀目”指的是夜盲症,食物疗法是应尽可能多吃一些富人吃的东西,如猪肝、鱼肉、胡萝卜和玉米等。 17(1)马铃薯肝(2)糖(3)维生素C18(1)④?使用同一滴管吸取吲哚酚试剂(2)多(3)先加等量的水果汁,再向其中滴吲哚酚试剂(使操作更加简便)(4)猕猴桃 第二节食物的消化和营养物质的吸收快乐预习感知一1.咽胃小肠磨碎搅拌运输2.唾液腺胃腺肝脏消化液消化酶3.唾液淀粉酶胃液胃液肝脏胆汁二1.较大蛋白质脂肪2.唾液淀粉酶麦芽糖三1.可吸收消化2.口腔胃小肠四、口腔食管小肠葡萄糖氨基酸甘

油脂肪酸无机盐维生素例题B轻松尝试应用1~5CBBCA6(1)2、3、5、8、9、10(2)2口腔9大肠5胃8小肠(3)5胃氨基酸2口腔8小肠(4)4肝脏胆汁11胆囊肠腔脂肪(5)8小肠三9大肠(6)1唾液腺4肝脏6胰腺胃腺肠腺(7)唾液腺6胰腺肠腺(8)阑尾能力提升1~11BCBCBDADDBD12(1)变蓝变蓝不变蓝变蓝(2)在0℃和80℃时,唾液不能使淀粉分解。(3)在37℃时,唾液能使淀粉分解。(4)设置4号试管的目的是与1,2,3号试管内的现象对照,以证明淀粉的分解是唾液的作用。13(1)葡萄糖(2)氨基酸(3)小肠(4)水无机盐维生素14(1)2(2)牙齿的咀嚼及舌的搅拌对淀粉消化作用(3)淀粉已被消化(4)唾液和牙齿的咀嚼及舌的搅拌和淀粉的消化都有关系 第三节合理膳食快乐预习感知一日三餐按时进餐不偏食不挑食不暴饮暴食二、谷类蔬菜水果薯类豆类瘦肉清淡少盐例题C轻松尝试应用1~7ACDDDDD8、(1)奶类、豆类动物性食物(2)无机盐维生素脂肪水(3)E糖类(4)D维生素C9、(1)糖类小肠(2)这两类食物中含有较为丰富的蛋白质,蛋白质是生长发育必不可少的营养物质(3)Ⅱ级维生素C能力提升1~ 8ADAACCBA9、(1)佝偻病(2)饮食结构不合理,食物中钙含量不足184(3)缺乏维生素D,影响钙的吸收(4)为正值生长发育时期的青少年提供蛋白质和钙10、(1)二(2)三、四胃(3)糖两能量(4)一日三餐,按时进餐,在每日摄入的总能

算法设计与分析考试题及答案

算法设计与分析考试题 及答案 Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】

一、填空题(20分) 1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:确定性 有穷性 可行性 0个或多个输入 一个或多个输出 2.算法的复杂性有时间复杂性 空间复杂性之分,衡量一个算法好坏的标准是 时间复杂度高低 3.某一问题可用动态规划算法求解的显着特征是 该问题具有最优子结构性质 4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X 和Y 的一个最长公共子序列{BABCD}或{CABCD}或{CADCD } 5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含一个(最优)解 6.动态规划算法的基本思想是将待求解问题分解成若干_子问题 ,先求解_子问题 ,然后从这些子问题 的解得到原问题的解。 7.以深度优先方式系统搜索问题解的算法称为回溯法 背包问题的回溯算法所需的计算时间为o(n*2n ) ,用动态规划算法所需的计算时间为o(min{nc,2n }) 9.动态规划算法的两个基本要素是最优子结构 _和重叠子问题 10.二分搜索算法是利用动态规划法实现的算法。 二、综合题(50分) 1.写出设计动态规划算法的主要步骤。 ①问题具有最优子结构性质;②构造最优值的递归关系表达式; ③最优值的算法描述;④构造最优解; 2. 流水作业调度问题的johnson 算法的思想。 ①令N 1={i|a i =b i };②将N 1中作业按a i 的非减序排序得到N 1’,将N 2中作业按b i 的非增序排序得到N 2’;③N 1’中作业接N 2’中作业就构成了满足Johnson 法则的最优调度。 3. 若n=4,在机器M1和M2上加工作业i 所需的时间分别为a i 和b i ,且 (a 1,a 2,a 3,a 4)=(4,5,12,10),(b 1,b 2,b 3,b 4)=(8,2,15,9)求4个作业的最优调度方案,并计算最优值。 步骤为:N1={1,3},N2={2,4}; N 1’={1,3}, N 2’={4,2}; 最优值为:38 4. 使用回溯法解0/1背包问题:n=3,C=9,V={6,10,3},W={3,4,4},其解空间有长度为3的0-1向量组成,要求用一棵完全二叉树表示其解空间(从根出发,左1右0),并画出其解空间树,计算其最优值及最优解。 解空间为{(0,0,0),(0,1,0),(0,0,1),(1,0,0),(0,1,1),(1,0,1), (1,1,0),(1,1,1)}。 解空间树为: 该问题的最优值为:16 最优解为:(1,1,0) 5. 设S={X 1,X 2,···,X n }是严格递增的有序集,利用二叉树的结点来存储S 中的元素,在表示S 的二叉搜索树中搜索一个元素X ,返回的结果有两种情形,(1)在二叉搜索树的内结点中找到X=X i ,其概率为b i 。(2)在二叉搜索树的叶结点中确定X ∈(X i ,X i+1),其概率为a i 。在表示S 的二叉搜索树T 中,设存储元素X i 的结点深度为C i ;叶结点(X i ,X i+1)的结点深度为d i ,则二叉搜索树T 的平均路长p 为多少假设二叉搜索树T[i][j]={X i ,X i+1,···,X j }最优值为m[i][j],W[i][j]= a i-1+b i +···+b j +a j ,则m[i][j](1<=i<=j<=n)递归关系表达式为什么 .二叉树T 的平均路长P=∑=+n i 1 Ci)(1*bi +∑=n j 0 dj *aj

2015年算法分析与设计期末考试试卷B卷

西南交通大学2015 — 2016学年第(一)学期考试试卷 课程代码 3244152课程名称 算法分析与设计 考试时间 120分钟 阅卷教师签字: __________________________________ 填空题(每空1分,共15分) 1、 程序是 (1) 用某种程序设计语言的具体实现。 2、 矩阵连乘问题的算法可由 (2) 设计实现。 3、 从分治法的一般设计模式可以看出,用它设计出的程序一般是 (3) 4、 大整数乘积算法是用 (4) 来设计的。 5、 贪心算法总是做出在当前看来 (5) 的选择。也就是说贪心算法并不从整体最优 考虑,它所做出的选择只是在某种意义上的 (6) o 6、 回溯法是一种既带有 (7) 又带有 (8) 的搜索算法。 7、 平衡二叉树对于查找算法而言是一种变治策略,属于变治思想中的 (9) 类型 8、 在忽略常数因子的情况下,0、门和0三个符号中, (10) 提供了算法运行时 间的一个上界。 9、 算法的“确定性”指的是组成算法的每条 (11) 是清晰的,无歧义的。 10、 冋题的(12) 是该冋题可用动态规划算法或贪心算法求解的关键特征。 11、 算法就是一组有穷 (13),它们规定了解决某一特定类型问题的 (14) o 12、 变治思想有三种主要的类型:实例化简,改变表现, (15) o 、 ___________________________________________________________________________________ L 线订装封密 线订装封密 、 __________________ 二 线订装封密 级班 选择题(每题2分,共20 分)

算法设计与分析课后部分习题答案

算法实现题3-7 数字三角形问题 问题描述: 给定一个由n行数字组成的数字三角形,如图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。编程任务: 对于给定的由n行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数字和的最大值。数据输入: 有文件input.txt提供输入数据。文件的第1行是数字三角形的行数n,1<=n<=100。接下来的n行是数字三角形各行的数字。所有数字在0-99之间。结果输出: 程序运行结束时,将计算结果输出到文件output.txt中。文件第1行中的数是计算出的最大值。 输入文件示例输出文件示 例 input.txt output.txt 5 30 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 源程序: #include "stdio.h" voidmain() { intn,triangle[100][100],i,j;//triangle数组用来存储金字塔数值,n表示行数 FILE *in,*out;//定义in,out两个文件指针变量 in=fopen("input.txt","r"); fscanf(in,"%d",&n);//将行数n读入到变量n中

for(i=0;i=0;row--)//从上往下递归计算 for(int col=0;col<=row;col++) if(triangle[row+1][col]>triangle[row+1][col+1]) triangle[row][col]+=triangle[row+1][col]; else triangle[row][col]+=triangle[row+1][col+1]; out=fopen("output.txt","w"); fprintf(out,"%d",triangle[0][0]);//将最终结果输出到output.txt中 } 算法实现题4-9 汽车加油问题 问题描述: 一辆汽车加满油后可行驶nkm。旅途中有若干加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。并证明算法能产出一个最优解。编程任务: 对于给定的n和k个加油站位置,编程计算最少加油次数。数据输入: 由文件input.txt给出输入数据。第1行有2个正整数n和k ,表示汽车加满油后可行驶nkm,且旅途中有k个加油站。接下来的1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第

《机械优化设计》习题及答案

机械优化设计习题及参考答案 1-1、简述优化设计问题数学模型的表达形式。 答:优化问题的数学模型就是实际优化设计问题的数学抽象。在明确设计变量、约束条件、目标函数之后,优化设计问题就可以表示成一般数学形式。求设计变量向量[]12 T n x x x x =使 ()min f x → 且满足约束条件 ()0 (1,2,)k h x k l == ()0(1,2,)j g x j m ≤= 2-1、何谓函数的梯度?梯度对优化设计有何意义? 答:二元函数f(x 1,x 2)在x 0点处的方向导数的表达式可以改写成下面的形式:?? ??????????????=??+??=??2cos 1cos 212cos 21cos 1θθθθxo x f x f xo x f xo x f xo d f 令xo T x f x f x f x f x f ?? ????????=????=?21]21[)0(, 则称它为函数f(x 1,x 2)在x 0点处的梯度。 (1)梯度方向就是函数值变化最快方向,梯度模就是函数变化率的最大值。 (2)梯度与切线方向d 垂直,从而推得梯度方向为等值面的法线方向。梯度)0(x f ?方向为函数变化率最大方向,也就就是最速上升方向。负梯度-)0(x f ?方向为函数变化率最小方向,即最速下降方向。 2-2、求二元函数f(x 1,x 2)=2x 12+x 22-2x 1+x 2在T x ]0,0[0=处函数变化率最 大的方向与数值。 解:由于函数变化率最大的方向就就是梯度的方向,这里用单位向量p 表

示,函数变化率最大与数值时梯度的模)0(x f ?。求f(x1,x2)在x0点处的梯度方向与数值,计算如下: ()??????-=??????+-=???? ??????????=?120122214210x x x x f x f x f 2221)0(?? ? ????+??? ????=?x f x f x f =5 ????? ???????-=??????-=??=5152512)0()0(x f x f p 2-3、试求目标函数()2221212143,x x x x x x f +-=在点X 0=[1,0]T 处的最速下降 方向,并求沿着该方向移动一个单位长度后新点的目标函数值。 解:求目标函数的偏导数 212 21124,46x x x f x x x f +-=??-=?? 则函数在X 0=[1,0]T 处的最速下降方向就是 ??????-=??????-+-=????????????????-=-?=====462446)(0121210 121021 21x x x x x x x x x f x f X f P 这个方向上的单位向量就是: 13]2,3[4 )6(]4,6[T 22T -=+--==P P e 新点就是 ????? ???????-=+=132133101e X X 新点的目标函数值

算法设计与分析考试题及答案

1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:_________,________,________,__________,__________。 2.算法的复杂性有_____________和___________之分,衡量一个算法 好坏的标准是______________________。 3.某一问题可用动态规划算法求解的显著特征是 ____________________________________。 4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X 和Y的一个最长公共子序列_____________________________。 5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含___________。 6.动态规划算法的基本思想是将待求解问题分解成若干____________,先求解___________,然后从这些____________的解得到原问题的解。 7.以深度优先方式系统搜索问题解的算法称为_____________。 8.0-1背包问题的回溯算法所需的计算时间为_____________,用动态规划算法所需的计算时间为____________。 9.动态规划算法的两个基本要素是___________和___________。 10.二分搜索算法是利用_______________实现的算法。 二、综合题(50分) 1.写出设计动态规划算法的主要步骤。 2.流水作业调度问题的johnson算法的思想。

算法分析与设计试卷

《算法分析与设计》试卷(A) (时间90分钟满分100分) 一、填空题(30分,每题2分)。 1.最长公共子序列算法利用的算法是( B )。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法2.在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( B ). A.回溯法 B.分支限界法 C.回溯法和分支限界法 D.回溯法求解子集树问题 3.实现最大子段和利用的算法是( B )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法4..广度优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法5.衡量一个算法好坏的标准是( C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 6.Strassen矩阵乘法是利用( A)实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 7. 使用分治法求解不需要满足的条件是( A )。 A 子问题必须是一样的 B 子问题不能够重复 C 子问题的解可以合并 D 原问题和子问题使用相同的方法解 8.用动态规划算法解决最大字段和问题,其时间复杂性为( B ). A.logn B.n C.n2 D.nlogn 9.解决活动安排问题,最好用( B )算法 A.分治 B.贪心 C.动态规划 D.穷举 10.下面哪种函数是回溯法中为避免无效搜索采取的策略( B ) A.递归函数 B.剪枝函数C。随机数函数 D.搜索函数11. 从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( C )之外都是最常见的方式. A.队列式分支限界法 B.优先队列式分支限界法 C.栈式分支限界法 D.FIFO分支限界法 12. .回溯算法和分支限界法的问题的解空间树不会是( D ). A.有序树 B.子集树 C.排列树 D.无序树 13.优先队列式分支限界法选取扩展结点的原则是( C )。 A、先进先出 B、后进先出 C、结点的优先级 D、随机14.下面是贪心算法的基本要素的是( C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解15.回溯法在解空间树T上的搜索方式是( A ). A.深度优先 B.广度优先 C.最小耗费优先 D.活结点优先 二、填空题(20分,每空1分)。 1.算法由若干条指令组成的又穷序列,且满足输入、输出、 确定性和有限性四个特性。 2.分支限界法的两种搜索方式有队列式(FIFO)分支限界法、优先队列式分支限界法,用一个队列来存储结点的表叫活节点表。

优化设计 孙靖民 课后答案第6章习题解答

第六章习题解答 1. 已知约束优化问题: 2)(0)()1()2()(min 21222112 221≤-+=≤-=?-+-=x x x g x x x g t s x x x f 试从第k 次的迭代点[]T k x 21)(-= 出发,沿由(-1 1)区间的随机数0.562和-0.254 所确定的方向进行搜索,完成一次迭代,获取一个新的迭代点)1(+k x 。并作图画出目标函数的等值线、可行域和本次迭代的搜索路线。 [解] 1)确定本次迭代的随机方向: []T T R S 0.412 0.9110.2540.5620.254 0.2540.5620.5622222-=??? ??? ??++= 2) 用公式:R k k S x x α+=+)()1( 计算新的迭代点。步长α取为搜索到约束边 界上的最大步长。到第二个约束边界上的步长可取为2,则: 176 .1)412.0(22822.0911.021221 2111 =-?+=+==?+-=+=++R k k R k k S x x S x x αα ? ? ? ???=+176.1822.01 k X 即: 该约束优化问题的目标函数的等值线、可行域和本次迭代的搜索路线如下图所示。

2. 已知约束优化问题: )(0)(0 25)(12 4)(min 2312222112 21≤-=≤-=≤-+=?--=x x g x x g x x x g t s x x x f 试以[][][]T T T x x x 33 ,14,120 30 20 1===为复合形的初始顶点,用复合形法进 行两次迭代计算。 [解] 1)计算初始复合形顶点的目标函数值,并判断各顶点是否为可行点: [][][]9 35 120101-=?==?=-=?=030302023314f x f x f x 经判断,各顶点均为可行点,其中,为最坏点。为最好点,0 203x x 2)计算去掉最坏点 02x 后的复合形的中心点: ?? ????+??????=???? ????????+??????==∑≠=3325.2211 32 10 3312i i i c x L x 3)计算反射点1 R x (取反射系数3.1=α) 20.69 3.30.551422.51.322.5)(110 2001-=????? ?=???? ????????-??????+??????=-+=R R c c R f x x x x x 值为可行点,其目标函数经判断α 4)去掉最坏点1 R 0301x x x x 和,,由02构成新的复合形,在新的复合形中 为最坏点为最好点,011R x x ,进行新的一轮迭代。 5)计算新的复合形中,去掉最坏点后的中心点得: ?? ????=???? ????????+??????= 3.151.775 3.30.5533211 c x 6)计算新一轮迭代的反射点得: ,完成第二次迭代。 值为可行点,其目标函数经判断413.14 5.9451.4825123.151.7751.33.151.775)(1 2011 12-=??????=???? ????????-????? ?+??????=-+=R R c c R f x x x x x α

(完整版)算法设计与分析期末考试卷及答案a

一.填空题(每空 2 分,共30分) 1.算法的时间复杂性指算法中的执行次数。 2.在忽略常数因子的情况下,O、和三个符号中,提供了算法运行时间的一个上界。 3.设D n表示大小为n的输入集合,t(I)表示输入为I时算法的运算时间, p(I)表示输入 I 出现的概率,则算法的平均情况下时间复杂性A(n)= 。 4.分治算法的时间复杂性常常满足如下形式的递归方程: f (n) d , n n0 f(n) af(n/c) g(n) , n n0 其中,g(n)表示。 5. 分治算法的基本步骤包括。6.回溯算法的基本思想是。 7.动态规划和分治法在分解子问题方面的不同点是。 8.贪心算法中每次做出的贪心选择都是最优选择。 9.PQ 式的分支限界法中,对于活结点表中的结点,其下界函数值越小,优先级 10.选择排序、插入排序和归并排序算法中,算法是分治算法。 11.随机算法的一个基本特征是对于同一组输入,不同的运行可能得到的结果。12. 对于下面的确定性快速排序算法,只要在步骤3 前加入随机 化步骤,就可得到一个随机化快速排序算法,该随机化步骤的功能是。 算法QUICKSORT 输入:n 个元素的数组A[1..n] 。 输出:按非降序排列的数组 A 中的元素

1. quicksort(1, n) end QUICKSORT _ _ 过程 quicksort(A, low, high) _ _ // 对 A[low..high] 中的元素按非降序排序。 _ 号 学 2. if low

算法设计与分析试卷(2010)

内部资料,转载请注明出处,谢谢合作。 算法设计与分析试卷(A 卷) 一、 选择题 ( 选择1-4个正确的答案, 每题2分,共20分) (1)计算机算法的正确描述是: A .一个算法是求特定问题的运算序列。 B .算法是一个有穷规则的集合,其中之规则规定了一个解决某一特定类型的问题的运算序列。 C .算法是一个对任一有效输入能够停机的图灵机。 D .一个算法,它是满足5 个特性的程序,这5个特性是:有限性、确定性、能 行性、有0个或多个输入且有1个或多个输出。 (2)影响程序执行时间的因素有哪些? A .算法设计的策略 B .问题的规模 C .编译程序产生的机器代码质量 D .计算机执行指令的速度 (3)用数量级形式表示的算法执行时间称为算法的 A .时间复杂度 B .空间复杂度 C .处理器复杂度 D .通信复杂度 (4)时间复杂性为多项式界的算法有: A .快速排序算法 B .n-后问题 C .计算π值 D .prim 算法 (5)对于并行算法与串行算法的关系,正确的理解是: A .高效的串行算法不一定是能导出高效的并行算法 B .高效的串行算法不一定隐含并行性 C .串行算法经适当的改造有些可以变化成并行算法 D. 用串行方法设计和实现的并行算法未必有效 (6)衡量近似算法性能的重要标准有: A .算法复杂度 B .问题复杂度 C .解的最优近似度 D .算法的策略 (7)分治法的适用条件是,所解决的问题一般具有这些特征: A .该问题的规模缩小到一定的程度就可以容易地解决; B .该问题可以分解为若干个规模较小的相同问题; C .利用该问题分解出的子问题的解可以合并为该问题的解 D .该问题所分解出的各个子问题是相互独立的。 (8)具有最优子结构的算法有: A .概率算法 B .回溯法 C .分支限界法 D .动态规划法 (9)下列哪些问题是典型的NP 完全问题: A .排序问题 B .n-后问题 C .m-着色问题 D .旅行商问题 (10)适于递归实现的算法有: A .并行算法 B .近似算法 C .分治法 D .回溯法 二、算法分析题(每小题5分,共10分) (11)用展开法求解递推关系: (12)分析当输入数据已经有序时快速排序算法的不足,提出算法的改进方案。 ???>+-==1 1)1(211)(n n T n n T

《算法设计与分析实用教程》习题参考解答

《算法设计与分析实用教程》参考解答 1-1 加减得1的数学游戏 西西很喜欢数字游戏,今天他看到两个数,就想能否通过简单的加减,使最终答案等于1。而他又比较厌烦计算,所以他还想知道最少经过多少次才能得到1。 例如,给出16,9:16-9+16-9+16-9-9-9+16-9-9=1,需要做10次加减法计算。 设计算法,输入两个不同的正整数,输出得到1的最少计算次数。(如果无法得到1,则输出-1)。 (1)若输入两个不同的正整数a,b均为偶数,显然不可能得到1。 设x*a与y*b之差为“1”或“-1”,则对于正整数a,b经n=x+y-1次加减可得到1。 为了求n的最小值,令n从1开始递增,x在1——n中取值,y=n+1-x: 检测d=x*a+y*b,若d=1或-1,则n=x+y-1为所求的最少次数。 (2)算法描述 // 两数若干次加减结果为1的数学游戏 #include void main() {long a,b,d,n,x,y; printf(" 请输入整数a,b: "); scanf("%ld,%ld",&a,&b); if(a%2==0 && b%2==0) { printf(" -1\n");return;} n=0; while(1) { n++; for(x=1;x<=n;x++) { y=n+1-x;d=x*a-y*b; if(d==1 || d==-1) // 满足加减结果为1 { printf(" n=%ld\n",n);return;} } } } 请输入整数a,b: 2012,19 961 请输入整数a,b: 101,2013 606

算法设计与分析试卷及答案

湖南科技学院二○年学期期末考试 信息与计算科学专业年级《算法设计与分析》试题 考试类型:开卷试卷类型:C卷考试时量:120分钟 题号一二三四五总分统分人 得分 阅卷人 复查人 一、填空题(每小题3 分,共计30 分) 1、用O、Ω与θ表示函数f与g之间得关系______________________________。 2、算法得时间复杂性为,则算法得时间复杂性得阶为__________________________。 3、快速排序算法得性能取决于______________________________。 4、算法就是_______________________________________________________。 5、在对问题得解空间树进行搜索得方法中,一个活结点最多有一次机会成为活结点得就是_________________________。 6、在算法得三种情况下得复杂性中,可操作性最好且最有实际价值得就是_____情况下得时间复杂性。 7、大Ω符号用来描述增长率得下限,这个下限得阶越___________,结果就越有价值。。 8、____________________________就是问题能用动态规划算法求解得前提。 9、贪心选择性质就是指____________________________________________________________________________________________________________________。 10、回溯法在问题得解空间树中,按______________策略,从根结点出发搜索解空间树。 二、简答题(每小题10分,共计30分) 1、试述回溯法得基本思想及用回溯法解题得步骤。 2、有8个作业{1,2,…,8}要在由2台机器M1与M2组成得流水线上完成加工。每个作业加工得顺序都就是先在M1上加工,然后在M2上加工。M1与M2加工作业i所需得时间分别为: M110 2 8 12 6 9414

机械优化设计课后习题答案

第一章习题答案 1-1 某厂每日(8h 制)产量不低于1800件。计划聘请两种不同的检验员,一级检验员的标准为:速度为25件/h ,正确率为98%,计时工资为4元/h ;二级检验员标准为:速度为15件/h ,正确率为95%,计时工资3元/h 。检验员每错检一件,工厂损失2元。现有可供聘请检验人数为:一级8人和二级10人。为使总检验费用最省,该厂应聘请一级、二级检验员各多少人? 解:(1)确定设计变量; 根据该优化问题给定的条件与要求,取设计变量为X = ?? ????=? ??? ??二级检验员一级检验员 21x x ; (2)建立数学模型的目标函数; 取检验费用为目标函数,即: f (X ) = 8*4*x 1+ 8*3*x 2 + 2(8*25*0.02x 1 +8*15*0.05x 2 ) =40x 1+ 36x 2 (3)本问题的最优化设计数学模型: min f (X ) = 40x 1+ 36x 2 X ∈R 3· s.t. g 1(X ) =1800-8*25x 1+8*15x 2≤0 g 2(X ) =x 1 -8≤0 g 3(X ) =x 2-10≤0 g 4(X ) = -x 1 ≤0 g 5(X ) = -x 2 ≤0 1-2 已知一拉伸弹簧受拉力F ,剪切弹性模量G ,材料重度r ,许用剪切应力[]τ,许用最大变形量[]λ。欲选择一组设计变量T T n D d x x x ][][2 32 1 ==X 使弹簧重量最轻,同时满足下列限制条件:弹簧圈数3n ≥, 簧丝直径0.5d ≥,弹簧中径21050D ≤≤。试建立该优化问题的数学模型。 注:弹簧的应力与变形计算公式如下 3 22234 881 ,1,(2n s s F D FD D k k c d c d Gd τλπ==+==旋绕比), 解: (1)确定设计变量; 根据该优化问题给定的条件与要求,取设计变量为X = ????? ? ????=??????????n D d x x x 2321; (2)建立数学模型的目标函数; 取弹簧重量为目标函数,即: f (X ) = 322 12 4 x x rx π (3)本问题的最优化设计数学模型:

算法分析与设计复习题及答案

算法分析与设计复习题及答案一、单选题 1.D 2.B 3.C 4.D 5.D 6.D 7.C 8.D 9.B 10.C 11.D 12.B 13.D 14.C 15.C 16.D 17.D 18.D 19.D 20.C 1.与算法英文单词algorithm具有相同来源的单词是()。 A logarithm B algiros C arithmos D algebra 2.根据执行算法的计算机指令体系结构,算法可以分为()。 A精确算法与近似算法B串行算法语并行算法 C稳定算法与不稳定算法D32位算法与64位算法 3.具有10个节点的完全二叉树的高度是()。 A6B5C3D 2 4.下列函数关系随着输入量增大增加最快的是()。 Alog2n B n2 C 2n D n! 5.下列程序段的S执行的次数为( )。 for i ←0 to n-1 do for j ←0 to i-1 do s //某种基本操作 A.n2 B n2/2 C n*(n+1) D n(n+1)/2 6.Fibonacci数列的第十项为( )。 A 3 B 13 C 21 D 34 7.4个盘子的汉诺塔,至少要执行移动操作的次数为( )。 A 11次 B 13次 C 15次 D 17次 8.下列序列不是堆的是()。 A 99,85,98,77,80,60,82,40,22,10,66 B 99,98,85,82,80,77,66,60,40,22,10 C 10,22,40,60,66,77,80,82,85,98,99 D 99,85,40,77,80,60,66,98,82,10,22 9.Strassen矩阵乘法的算法复杂度为()。 AΘ(n3)BΘ(n2.807) CΘ(n2) DΘ(n) 10.集合A的幂集是()。 A.A中所有元素的集合 B. A的子集合 C. A 的所有子集合的集合 D. 空集 11.与算法英文单词algorithm具有相同来源的单词是()。 A logarithm B algiros C arithmos D algebra 12.从排序过程是否完全在内存中显示,排序问题可以分为()。 A稳定排序与不稳定排序B内排序与外排序 C直接排序与间接排序D主排序与辅助排序 13.下列()不是衡量算法的标准。 A时间效率B空间效率 C问题难度D适应能力 14.对于根树,出度为零的节点为()。 A0节点B根节点C叶节点D分支节点 15.对完全二叉树自顶向下,从左向右给节点编号,节点编号为10的父节点编号为()。 A0B2C4D6 16.下列程序段的算法时间的复杂度为()。 for i ←0 to n do for j ←0 to m do

计算机算法设计与分析习题及答案

计算机算法设计与分析习 题及答案 Prepared on 24 November 2020

《计算机算法设计与分析》习题及答案 一.选择题 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是(A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4. 回溯法解旅行售货员问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 5.下列算法中通常以自底向上的方式求解最优解的是(B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 6、衡量一个算法好坏的标准是( C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 7、以下不可以使用分治法求解的是( D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 8. 实现循环赛日程表利用的算法是(A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 9.下面不是分支界限法搜索方式的是(D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先

10.下列算法中通常以深度优先方式系统搜索问题解的是(D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 11.备忘录方法是那种算法的变形。( B ) A、分治法 B、动态规划法 C、贪心法 D、回溯法 12.哈夫曼编码的贪心算法所需的计算时间为(B )。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 13.分支限界法解最大团问题时,活结点表的组织形式是(B )。 A、最小堆 B、最大堆 C、栈 D、数组 14.最长公共子序列算法利用的算法是(B)。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 15.实现棋盘覆盖算法利用的算法是(A )。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 16.下面是贪心算法的基本要素的是(C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解 17.回溯法的效率不依赖于下列哪些因素( D ) A.满足显约束的值的个数 B. 计算约束函数的时间 C.计算限界函数的时间 D. 确定解空间的时间 18.下面哪种函数是回溯法中为避免无效搜索采取的策略(B ) A.递归函数 B.剪枝函数 C。随机数函数 D.搜索函数 19. (D)是贪心算法与动态规划算法的共同点。

优化设计习题答案精编版

第一、填空题 1.组成优化设计数学模型的三要素是 设计变量 、 目标函数 、 约束条件 。 2.函数()2 2 121 212,45f x x x x x x =+-+在024X ??=????点处的梯度为120-?? ???? ,海赛矩阵 为2442-????-?? 3.目标函数是一项设计所追求的指标的数学反映,因此对它最基本的要求是能用 来评价设计的优劣,,同时必须是设计变量的可计算函数 。 4.建立优化设计数学模型的基本原则是确切反映 工程实际问题,的基础上力求简洁 。 5.约束条件的尺度变换常称 规格化,这是为改善数学模型性态常用的一种方法。 6.随机方向法所用的步长一般按 加速步长 法来确定,此法是指依次迭代的步 长按一定的比例 递增的方法。 7.最速下降法以 负梯度 方向作为搜索方向,因此最速下降法又称为 梯 度法,其收敛速度较 慢 。 8.二元函数在某点处取得极值的充分条件是()00f X ?=必要条件是该点处的海赛矩阵正定 9.拉格朗日乘子法的基本思想是通过增加变量将等式约束 优化问题变成 无 约束优化问题,这种方法又被称为 升维 法。 10改变复合形形状的搜索方法主要有反射,扩张,收缩,压缩 11坐标轮换法的基本思想是把多变量 的优化问题转化为 单变量 的优化问题 12.在选择约束条件时应特别注意避免出现 相互矛盾的约束, ,另外应当尽量减少不必要的约束 。 13.目标函数是n 维变量的函数,它的函数图像只能在n+1, 空间中描述出来,为了在n 维空间中反映目标函数的变化情况,常采用 目标函数等值面 的方法。 14.数学规划法的迭代公式是 1k k k k X X d α+=+ ,其核心是 建立搜索方向, 和 计算最佳步长 15协调曲线法是用来解决 设计目标互相矛盾 的多目标优化设计问题的。

《算法分析与设计》期末试题及参考答案

《算法分析与设计》期末试题及参考答案 一、简要回答下列问题: 1.算法重要特性是什么? 1.确定性、可行性、输入、输出、有穷性 2. 2.算法分析的目的是什么? 2.分析算法占用计算机资源的情况,对算法做出比较和评价,设计出额更好的算法。 3. 3.算法的时间复杂性与问题的什么因素相关? 3. 算法的时间复杂性与问题的规模相关,是问题大小n的函数。 4.算法的渐进时间复杂性的含义? 4.当问题的规模n趋向无穷大时,影响算法效率的重要因素是T(n)的数量级,而其他因素仅是使时间复杂度相差常数倍,因此可以用T(n)的数量级(阶)评价算法。时间复杂度T(n)的数量级(阶)称为渐进时间复杂性。 5.最坏情况下的时间复杂性和平均时间复杂性有什么不同? 5. 最坏情况下的时间复杂性和平均时间复杂性考察的是n固定时,不同输入实例下的 算法所耗时间。最坏情况下的时间复杂性取的输入实例中最大的时间复杂度: W(n) = max{ T(n,I) } , I∈Dn 平均时间复杂性是所有输入实例的处理时间与各自概率的乘积和: A(n) =∑P(I)T(n,I) I∈Dn 6.简述二分检索(折半查找)算法的基本过程。 6. 设输入是一个按非降次序排列的元素表A[i:j] 和x,选取A[(i+j)/2]与x比较, 如果A[(i+j)/2]=x,则返回(i+j)/2,如果A[(i+j)/2]

《算法分析与设计》期末复习题

一、选择题 1.一个.java文件中可以有()个public类。 A.一个B.两个C.多个D.零个 2.一个算法应该是() A.程序B.问题求解步骤的描述 C.要满足五个基本特性D.A和C 3.用计算机无法解决“打印所有素数”的问题,其原因是解决该问题的算法违背了算法特征中的()A.唯一性B.有穷性C.有0个或多个输入D.有输出 4.某校有6位学生参加学生会主席竞选,得票数依次为130,20,98,15,67,3。若采用冒泡排序算法对其进行排序,则完成第二遍时的结果是() A.3,15,130,20,98,67B.3,15,20,130,98,67 C.3,15,20,67,130,98 D.3,15,20,67,98,130 5.下列关于算法的描述,正确的是() A.一个算法的执行步骤可以是无限的B.一个完整的算法必须有输出 C.算法只能用流程图表示D.一个完整的算法至少有一个输入 6.Java Application源程序的主类是指包含有()方法的类。 A、main方法 B、toString方法 C、init方法 D、actionPerfromed方法 7.找出满足各位数字之和等于5的所有三位数可采用的算法思路是() A.分治法B.减治法C.蛮力法D.变治法 8.在编写Java Application程序时,若需要使用到标准输入输出语句,必须在程序的开头写上( )语句。 A、import java.awt.* ; B、import java.applet.Applet ; C、import java.io.* ; D、import java.awt.Graphics ; 9.计算某球队平均年龄的部分算法流程图如图所示,其中:c用来记录已输入球员的人数,sum用来计算有效数据之和,d用来存储从键盘输入的球员年龄值,输入0时表示输入结束。

相关文档
最新文档