北京工业大学算法设计分析一纸开卷

合集下载

北京工业大学编译原理考试一纸开卷【期末复习总结】

北京工业大学编译原理考试一纸开卷【期末复习总结】

1、简要解释编译程序中的遍(趟)的含义。

就是对源程序或者源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果和目标程序.通常,每遍的工作有外存上获得的前一遍的中间结果开始,完成它所含的有关工作之后,再把结果记录于外存..既可以将几个不同阶段合为一遍,也可以把一个阶段的工作分为若干遍。

2、何为“标识符”?何为“名字”?两者的区别是什么?在程序设计语言中,标识符是一个最基本的概念,其定义为:凡以字母开头的字母数字序列(有限个字符)都是标识符。

当给予某标识符以确切的含义时,这个标识符就叫做名字。

程序语言中各种名字都是用标识符表示的,只是标识符是一个没有意义的字符序列,而名字却有着确切的意义和属性。

3、简述为什么自顶向下的语法分析技术不能处理具有左递归的文法?这是由于在自顶向下的语法分析技术中,要解决的问题是根据当前输入符号判断将栈顶(最左)的非终结符号替换成哪条规则的右部,若文法具有左递归,则在分析过程中,无法判断出替换的规则,造成无穷递归求解的过程。

4、简述编译程序的工作过程编译程序的工作过程,是指从输入源程序开始到输出目标程序为止的整个过程,是非常复杂的,就其过程而言,一般可以划分为五个工作阶段:①词法分析,对构成源程序的字符串进行扫描和分解,识别出一个个的单词;②语法分析,根据语言的语法规则,把单词符号串分解成各类语法单位;③语义分析与中间代码产生,即对各类语法单位,分析其汉一并进行初步翻译;④代码优化,以期产生更高效的代码;⑤目标代码生成,把中间代码变换成特定机器上的低级语言指令形式。

5、什么是语法制导翻译?是指在语法规则的制导下,通过计算语义规则,完成对输入符号的翻译。

由于使用属性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或归约的同时又使用这些语义规则来指导翻译与最终产生目标代码,所以称为语法制导翻译。

6、请简要阐述高级程序设计语言参数传递的常用方式1、传值:计算实参并将其右值传递给被调用过程2、传地址:调用过程将实参地址传递给被调用过程3、传值结果:将传值和传地址两种方式结合4、传名:只有在被调用过程中用到形参时才动态的建立起它与实参的联系7、什么是自展?什么是交叉编译?自展过程就是用低级语言先实现一个简单的编译器,然后用这个编译器的语言再去编写一个更高级的编译器——这个新编译器是旧编译器的扩展——的过程。

算法设计与分析期末笔试题(2011)

算法设计与分析期末笔试题(2011)
15 / 16
(2)分析算法的正确性(3 分) (3)说明算法的时间复杂度(2 分)。
16 / 16
(c) 剩余顶点构成其补图的一个团
(d) 运行时间为 O(V+E)
4 / 16
得分 三、求解下列递归式,假设 T(1)=1(每小题 5 分,共 15 分)
(1) T(n) 2T(n / 2) n log n
5 / 16
(2) T (n) 2T (n / 2) n / log n
6 / 16
1 / 16
得分
一、填空题(每空 1 分,共 20 分)
1.请将下列 5 个关于 n 的函数 ( 2 )lgn , n2 , lg 2 n, (lg n)!, 2 2lgn 按渐进增
长的关系排序,使得������1 = Ω ������2 , ������2 = Ω ������3 , … , ������4 = Ω ������5 。 ____________、____________、____________、____________和____________。
(3) T(n) nT( n) nlog n
7 / 16
得分 四、简答题(共 20 分)
(1)100 个人排队乘坐有 100 个座位的飞机,正常情况时每个都会对号入坐, 但是,第一个上飞机的是个傻子,他随机坐了一个位子,接下来的人上飞机时,如 果自己座位被人坐了就会随机找个座位坐下,否则就坐自己坐位。问题:最后一个 上飞机的人坐到自己座位的概率是多少?(3 分)
假设有一个字符串������ = ������1������2 … ������������ ,y 的一个“分散子串”是指������ = ������1������2 … ������������ , ������ ≤ ������并且������������ = ������������ ,1 ≤ ������ ≤ ������, 1 ≤ ������1 ≤ ������2 ≤ ⋯ ≤ ������������ ≤ ������。例如,字符串 12345 就 是字符串 1ds2j34muy5dy 一个分散子串。 (1)请设计一个时间复杂度为 O(n)的算法来判断 x 是否是 y 的分散子串。(5 分)

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

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

《算法分析与设计》期末试题及参考答案一、简要回答下列问题:1.算法重要特性是什么?2.算法分析的目的是什么?3.算法的时间复杂性与问题的什么因素相关?4.算法的渐进时间复杂性的含义?5.最坏情况下的时间复杂性和平均时间复杂性有什么不同?6.简述二分检索(折半查找)算法的基本过程。

7.背包问题的目标函数和贪心算法最优化量度相同吗?8.采用回溯法求解的问题,其解如何表示?有什么规定?9.回溯法的搜索特点是什么?10.n皇后问题回溯算法的判别函数place的基本流程是什么?11.为什么用分治法设计的算法一般有递归调用?12.为什么要分析最坏情况下的算法时间复杂性?13.简述渐进时间复杂性上界的定义。

14.二分检索算法最多的比较次数?15.快速排序算法最坏情况下需要多少次比较运算?16.贪心算法的基本思想?17.回溯法的解(x1,x2,……x n)的隐约束一般指什么?18.阐述归并排序的分治思路。

19.快速排序的基本思想是什么。

20.什么是直接递归和间接递归?消除递归一般要用到什么数据结构?21.什么是哈密顿环问题?22.用回溯法求解哈密顿环,如何定义判定函数?23.请写出prim算法的基本思想。

二、复杂性分析1、MERGESORT(low,high)if low<high;then mid←(low,high)/2;MERGESORT(low,mid);MERGESORT(mid+1,high);MERGE(low,mid,high);endifend MERGESORT2、procedure S1(P,W,M,X,n)i←1; a←0while i≤ n doif W(i)>M then return endifa←a+ii←i+1 ;repeatend3.procedure PARTITION(m,p)Integer m,p,i;global A(m:p-1)v←A(m);i←mlooploop i←i+1 until A(i) ≥v repeatloop p←p-1 until A(p) ≤v repeatif i<pthen call INTERCHANGE(A(i),A(p))else exitendifrepeatA(m) ←A(p);A(p) ←vEnd PARTITION4.procedure F1(n)if n<2 then return(1)else return(F2(2,n,1,1))endifend F1procedure F2(i,n,x,y)if i≤nthen call F2(i+1,n,y,x+y)endifreturn(y)end F25.procedure MAX(A,n,j)xmax←A(1);j←1for i←2 to n doif A(i)>xmax then xmax←A(i); j←i;endif repeatend MAX6.procedure BINSRCH(A,n,x,j)integer low,high,mid,j,n;low←1;high←nwhile low≤high domid←|_(low+high)/2_|case:x<A(mid):high←mid-1:x>A(mid):low←mid+1:else:j ←mid; returnendcase repeat j ←0 end BINSRCH三、算法理解1、写出多段图最短路经动态规划算法求解下列实例的过程,并求出最优值。

算法设计与分析-习题参考答案

算法设计与分析-习题参考答案

算法设计与分析基础习题1.15..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:●如果d整除u和v, 那么d一定能整除u±v;●如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。

数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。

故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.21.(农夫过河)P—农夫W—狼G—山羊C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5.描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法DectoBin(n)//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进.算法MinDistance(A[0..n-1])//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.31.考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表‖60,35,81,98,14,47‖排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表‖60,35,81,98,14,47‖排序的过程如下所示:b.该算法不稳定.比如对列表‖2,2*‖排序c.该算法不在位.额外空间for S and Count[] 4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i 个元素(1<=i<=n)b.删除有序数组的第i 个元素(依然有序) hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array ’s element(e.g., 0 for an array of positive numbers ) to mark the i th position is empty. (―lazy deletion ‖)第2章 习题2.17.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n )∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。

(中英文对照)2014秋季算法分析与设计模拟试卷

(中英文对照)2014秋季算法分析与设计模拟试卷

北京工业大学2014 ——2015 学年第二学期算法设计与分析期末考试模拟试卷 A卷考试说明:承诺:本人已学习了《北京工业大学考场规则》和《北京工业大学学生违纪处分条例》,承诺在考试过程中自觉遵守有关规定,服从监考教师管理,诚信考试,做到不违纪、不作弊、不替考。

若有违反,愿接受相应的处分。

承诺人:学号:班号:。

注:本试卷共三大题,共 6 页,满分100分,考试时答案请写在试卷空白处。

一、算法时间复杂性问题(共30分)Part 1. The Time Complexity Of the Algorithm Test1、试证明下面的定理:[12分](1) 如果f(n)=O(s(n))并且g(n)=O(r(n)),则f(n)+g(n)=O(s(n)+r(n))(2) 如果f(n)=O(s(n))并且g(n)=O(r(n)),则f(n)*g(n)=O(s(n)*r(n)) 1. Prove the following Theorem [12 marks](1) if f(n)=O(s(n)) and g(n)=O(r(n)), to prove f(n)+g(n)=O(s(n)+r(n))(2) if f(n)=O(s(n)) and g(n)=O(r(n)),to prove f(n)*g(n)=O(s(n)*r(n))2、已知有如下的断言:f(n)=O(s(n))并且g(n)=O(r(n))蕴含f(n)-g(n)=O(s(n)-r(n)) 请你举出一个反例。

[8分]2. Known as the following assertionIf f(n)=O(s(n)) and g(n)=O(r(n)),then f(n)-g(n)=O(s(n)-r(n)) 。

Please cite a counter-example [8 marks]3、假设某算法在输入规模为n时的计算时间为:T(n)=3*2n,在A型计算机上实现并完成该算法的时间为t秒,现有更先进的B型计算机,其运算速度为A 型计算机的256倍。

《算法设计与分析》期末必考复习及答案题整理

《算法设计与分析》期末必考复习及答案题整理

《算法设计与分析》期末必考复习及答案题整理1、分治法的基本思想:是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题相同。

递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

2、贪心选择性质:指所求问题的整体最优解可以通过一系列局部最优的选择,3、 Prim算法:设G=(V,E)是连通带权图,V={1,2,…,n}。

构造G的最小生成树的Prim算法的基本思想是:首先置S={1},然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件i?S,j?V-S,且c[j]最小的边,将顶点j添加到S 中。

这个过程一直进行到S=V时为止。

4、什么是剪枝函数:回溯法搜索解空间树时,通常采用两种策略避免无效搜索,提高回溯法的搜索效率。

其一是用约束函数在扩展结点处剪去不满足约束的子树;其二是用限界函数剪去得不到最优解的子树。

这两类函数统称为剪枝函数。

6、分支限界法的基本思想:(1)分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

(2)在分支限界法中,每一个活结点只有一次机会成为扩展结点。

活结点一旦成为扩展结点,就一次性产生其所有儿子结点。

在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

(3)此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程,这个过程一直持续到找到所需的解或活结点表这空时为止。

5、什么是算法的复杂性:是该算法所需要的计算机资源的多少,它包括时间和空间资源。

6、最优子结构性质:该问题的最优解包含着其子问题的最优解。

7、回溯法:是一个既带有系统性又带有跳跃性的搜索算法。

这在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。

算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解。

如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。

2022年北方工业大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年北方工业大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年北方工业大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、将线性表的数据元素进行扩充,允许带结构的线性表是()。

A.串B.树C.广义表D.栈2、将两个各有N个元素的有序表归并成一个有序表,其最少的比较次数是()。

A.NB.2N-1C.2ND.N-13、静态链表中指针表示的是()。

A.下一元素的地址B.内存储器的地址C.下一元素在数组中的位置D.左链或右链指向的元素的地址4、循环队列A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,则当前队列中的元素数是()。

A.(rear-front+m)%mB.rear-front+1C.rear-front-1D.rear-front5、有六个元素6,5,4,3,2,1顺序入栈,下列不是合法的出栈序列的是()。

A.543612B.453126C.346521D.2341566、若一棵二叉树的前序遍历序列为a,e,b,d,c,后序遍历序列为b, c,d,e,a,则根结点的孩子结点()。

A.只有e B.有e、b C.有e、c D.无法确定7、排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一趟排序。

下列排序方法中,每一趟排序结束时都至少能够确定一个元素最终位置的方法是()。

Ⅰ.简单选择排序Ⅱ.希尔排序Ⅲ.快速排序Ⅳ.堆排Ⅴ.二路归并排序A.仅Ⅰ、Ⅲ、Ⅳ B.仅Ⅰ、Ⅱ、Ⅲ C.仅Ⅱ、Ⅲ、Ⅳ D.仅Ⅲ、Ⅳ、Ⅴ8、有关二叉树下列说法正确的是()。

A.二叉树的度为2B.一棵二叉树的度可以小于2C.二叉树中至少有一个结点的度为2D.二叉树中任何一个结点的度都为29、设X是树T中的一个非根结点,B是T所对应的二叉树。

在B中,X是其双亲的右孩子,下列结论正确的是()。

A.在树T中,X是其双亲的第一个孩子B.在树T中,X一定无右兄弟C.在树T中,X一定是叶结点D.在树T中,X一定有左兄弟10、对序列{15,9,7,8,20,-1,4}用希尔排序方法排序,经一趟后序列变为{15,-1,4,8,20,9,7}则该次采用的增量是()。

北京航空航天大学算法设计与分析试题答案(软件)

北京航空航天大学算法设计与分析试题答案(软件)

2006-2007学年第二学期《计算机算法设计与分析》试题院系:软件学院专业:软件工程年级:2004级一.简答题(共10分)略二.计算题(35分)1. (6 分)对下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)= Q(g(n))或f(n)=8 (g(n))。

(1)f(n)=3n, g(n)=2n2(2)f(n)=log n + 5, g(n)=log n(3)f(n)=log n, g(n尸J n咨:(1)f(n) = Q(g(n)) (2 分)(2)f(n) = 9(g(n)) (2 分)(3)f(n) = O(g(n)) (2 分)2. (8分)采用动态规划策略,计算a= {5,-37-4,-5,9,-2,10,-3,2}的最大子段和, 并给出这个最大子段和的起始下标和终止下标。

[设数组a中的元素下标从1开始。

]要求给出过程。

答:b[1]=5;b[2]=max{b[1]+a[2] , a[2]}=max{2,-3}=2b[3]=max{b[2]+a[3] , a[3]}=max{9,7}=9b[4]=max{b[3]+a[4] , a[4]}=max{5,-4}=5b[5]=max{b[4]+a[5] , a[5]}=max{0,-5}=0b[6]=max{b[5]+a[6] , a[6]}=max{9,9}=9b[7]=max{b[6]+a[7] , a[7]}=max{7,-2}=7b[8]=max{b[7]+a[8] , a[8]}=max{17,10}=17b[9]=max{b[8]+a[9] , a[9]}=max{14,-3}=14b[10]=max{b[9]+a[10] , a[10]}=max{16,2}=16(上述每两行1分,共5分)最大子段和为17 (1分)(若数组下标从1开始)起始下标:6 (1分),终止下标:8 (1分)(若数组下标从0开始)起始下标:5 ( 0.5分),终止下标:7 (0.5分)3 .(11分)设有3件工作分配给3个人,将工作i分配给第j个人所花的费用为C ij,现将为每一个人都分配1件不同的工作,并使总费用达到最小。

算法设计与分析试卷(一)及答案.doc

算法设计与分析试卷(一)及答案.doc

算法设计与分析试卷(一)及答案算术分析试卷(卷一)课程名称算术分析编号问题编号1234总分评估师一、填空(每题3分,共30分)1.算法的优点和缺点可以用总和来衡量。

2.这种不断回头寻找目标的方法叫做。

3.直接或间接调用自己的算法称为。

4.q符号用算法复杂性的表示来表示。

5.分治法产生的子问题通常是它提供了使用的便利。

6.建立计算模型的目的是使。

7.以下步骤的顺序是。

①调试程序②分析问题③设计算法④编程。

8.最优子结构性质的含义是。

9.贪婪算法从初始阶段开始,每个阶段总是做出贪婪的选择。

10.拉斯维加斯算法一定找到了解决方案。

二、选择题(每题2分,共20分)1.霍夫曼编码可以用()算法实现。

分治策略b,动态规划方法c,贪婪方法d,回溯方法2、以下不是基本的计算模型()。

随机存取存储器、只读存储器、只读存储器3.在以下算法中,最佳解决方案通常是从上到下求解()。

一、分治法b、动态规划法c、贪心法d、回溯法考试科目: 类别:姓名:学生编号:-一、填空(每题3分,共30分)1.算法的优点和缺点可以用总和来衡量。

2.这种不断回头寻找目标的方法叫做。

3.直接或间接调用自己的算法称为。

4.q符号用算法复杂性的表示来表示。

5.分治法产生的子问题通常是它提供了使用的便利。

6.建立计算模型的目的是使。

7.以下步骤的顺序是。

①调试程序②分析问题③设计算法④编程。

8.最优子结构性质的含义是。

9.贪婪算法从初始阶段开始,每个阶段总是做出贪婪的选择。

10.拉斯维加斯算法一定找到了解决方案。

二、选择题(每题2分,共20分)1.霍夫曼编码可以用()算法实现。

分治策略b,动态规划方法c,贪婪方法d,回溯方法2、以下不是基本的计算模型()。

随机存取存储器、只读存储器、只读存储器3.在以下算法中,最佳解决方案通常是从上到下求解()。

一、分治法b、动态规划法c、贪心法d、回溯法考试科目:类别:姓名:学生编号:最佳解决方案是:参考答案我填补空白1.空间复杂性时间复杂性2.追溯方法3.递归算法4.渐进定边界还是紧致边界5、小模式递归技术的原始问题6.问题的计算复杂性分析有一个共同的客观标准。

(完整word版)北航研究生算法设计与分析Assignment_2

(完整word版)北航研究生算法设计与分析Assignment_2

用分支定界算法求以下问题:某公司于乙城市的销售点急需一批成品,该公司成品生产基地在甲城市。

甲城市与乙城市之间共有n 座城市,互相以公路连通。

甲城市、乙城市以及其它各城市之间的公路连通情况及每段公路的长度由矩阵M1 给出。

每段公路均由地方政府收取不同额度的养路费等费用,具体数额由矩阵M2 给出。

请给出在需付养路费总额不超过1500 的情况下,该公司货车运送其产品从甲城市到乙城市的最短运送路线。

具体数据参见文件:m1.txt: 各城市之间的公路连通情况及每段公路的长度矩阵(有向图); 甲城市为城市Num.1,乙城市为城市Num.50。

m2.txt: 每段公路收取的费用矩阵(非对称)。

思想:利用Floyd算法的基本方法求解。

程序实现流程说明:1.将m1.txt和m2.txt的数据读入两个50×50的数组。

2.用Floyd算法求出所有点对之间的最短路径长度和最小费用。

3.建立一个堆栈,初始化该堆栈。

4.取出栈顶的结点,检查它的相邻的所有结点,确定下一个当前最优路径上的结点,被扩展的结点依次加入堆栈中。

在检查的过程中,如果发现超出最短路径长度或者最小费用,则进行”剪枝”,然后回溯。

5.找到一个解后,保存改解,然后重复步骤4。

6.重复步骤4、5,直到堆栈为空,当前保存的解即为最优解。

时间复杂度分析:Floyd算法的时间复杂度为3O N,N为所有城市的个数。

()该算法的时间复杂度等于DFS的时间复杂度,即O(N+E)。

其中,E为所有城市构成的有向连通图的边的总数。

但是因为采用了剪枝,会使实际运行情况的比较次数远小于E。

求解结果:算法所得结果:甲乙之间最短路线长度是:464最短路线收取的费用是:1448最短路径是:1 3 8 11 15 21 23 26 32 37 39 45 47 50C源代码(注意把m1.txt与m2.txt放到与源代码相同的目录下,下面代码可直接复制运行):#include<stdlib.h>#include<stdio.h>#include<time.h>#include<string.h>#define N 50#define MAX 52void input(int a[N][N],int b[N][N]);void Floyd(int d[N][N]);void fenzhi(int m1[N][N],int m2[N][N],int mindist[N][N],int mincost[N][N]);int visited[N],bestPath[N];void main(){clock_t start,finish;double duration;int i,j,mindist[N][N],mincost[N][N],m1[N][N],m2[N][N]; /* m1[N][N]和m2[N][N]分别代表题目所给的距离矩阵和代价矩阵*/// int visited[N],bestPath[N];FILE *fp,*fw;// system("cls");time_t ttime;time(&ttime);printf("%s",ctime(&ttime));start=clock();for(i=0;i<N;i++){visited[i]=0;bestPath[i]=0;}fp=fopen("m1.txt","r"); /* 把文件中的距离矩阵m1读入数组mindist[N][N] */if(fp==NULL){printf("can not open file\n");return;}for(i=0;i<N;i++)for(j=0;j<N;j++)fscanf(fp,"%d",&mindist[i][j]);fclose(fp); /* 距离矩阵m1读入完毕*/fp=fopen("m2.txt","r"); /* 把文件中的代价矩阵m2读入数组mincost[N][N] */if(fp==NULL){printf("can not open file\n");return;}for(i=0;i<N;i++)for(j=0;j<N;j++)fscanf(fp,"%d",&mincost[i][j]);fclose(fp); /* 代价矩阵m2读入完毕*/input(m1,mindist); /* mindist[N][N]赋值给m1[N][N],m1[N][N]代表题目中的距离矩阵*/input(m2,mincost); /* mincost[N][N]赋值给m2[N][N],m2[N][N]代表题目中的代价矩阵*/for(i=0;i<N;i++) /* 把矩阵mindist[i][i]和mincost[i][i]的对角元素分别初始化,表明城市到自身不连通,代价为0 */{mindist[i][i]=9999;mincost[i][i]=0;}Floyd(mindist); /* 用弗洛伊德算法求任意两城市之间的最短距离,结果存储在数组mindist[N][N]中*//*fw=fopen("1.txt","w");for(i=0;i<N;i++){for(j=0;j<N;j++)fprintf(fw,"%4d ",mindist[i][j]);fprintf(fw,"\n");}fclose(fw);// getchar();//*/Floyd(mincost); /* 用弗洛伊德算法求任意两城市之间的最小代价,结果存储在数组mincost[N][N]中*//*fw=fopen("2.txt","w");for(i=0;i<N;i++){for(j=0;j<N;j++)fprintf(fw,"%4d ",mincost[i][j]);fprintf(fw,"\n");}fclose(fw);// getchar();//*/fenzhi(m1,m2,mindist,mincost); /* 调用分支定界的实现函数,寻找出所有的可行路径并依次输出*/finish=clock();duration = (double)(finish - start) / CLOCKS_PER_SEC;printf( "%f seconds\n", duration );//*/}void Floyd(int d[N][N]) /* 弗洛伊德算法的实现函数*/{int v,w,u,i;for(u=0;u<N;u++){for(v=0;v<N;v++){for(w=0;w<N;w++)if(d[v][u]+d[u][w]<d[v][w]){//printf("v,w,u,d[v][u],d[u][w],d[v][w] %d %d %d %d %d %d",v+1,w+1,u+1,d[v][u],d[u][w],d[v][ w]);getchar();d[v][w]=d[v][u]+d[u][w];}}}}void input(int a[N][N],int b[N][N]) /* 把矩阵b赋值给矩阵a */{int i,j;for(i=0;i<N;i++)for(j=0;j<N;j++)a[i][j]=b[i][j];}void fenzhi(int m1[N][N],int m2[N][N],int mindist[N][N],int mincost[N][N]){int stack[MAX],depth=0,next,i,j; /* 定义栈,depth表示栈顶指针;next指向每次遍历时当前所处城市的上一个已经遍历的城市*/int bestLength,shortestDist,minimumCost,distBound=9999,costBound=9999;int cur,currentDist=0,currentCost=0; /* cur指向当前所处城市,currentDist和currentCost分别表示从甲城市到当前所处城市的最短距离和最小代价,currentDist和currentCost初值为0表示从甲城市出发开始深度优先搜索*/stack[depth]=0; /* 对栈进行初始化*/stack[depth+1]=0;visited[0]=1; /* visited[0]=1用来标识从甲城市开始出发进行遍历,甲城市已被访问*/while(depth>=0) /* 表示遍历开始和结束条件,开始时从甲城市出发,栈空,depth=0;结束时遍历完毕,所有节点均被出栈,故栈也为空,depth=0 *//* 整个while()循环体用来实现从当前的城市中寻找一个邻近的城市*/{cur=stack[depth]; /* 取栈顶节点赋值给cur,表示当前访问到第cur号城市*/ next=stack[depth+1]; /* next指向当前所处城市的上一个已经遍历的城市*/for(i=next+1;i<N;i++) /* 试探当前所处城市的每一个相邻城市*/{if((currentCost+mincost[cur][N-1]>costBound)||(currentDist+mindist[cur][N-1]>=distBound)){ /* 所试探的城市满足剪枝条件,进行剪枝*///printf("here1 %d %d %d %d %d %d %d\n",cur,currentCost,mincost[cur][49],costBound,curre ntDist,mindist[cur][49],distBound); getchar();//printf("%d %d %d %d %d %d",cur,i,m1[cur][i],currentCost,mincost[cur][49],costBound); getchar();continue;}if(m1[cur][i]==9999) continue; /* 所试探的城市不连通*/if(visited[i]==1) continue; /* 所试探的城市已被访问*/if(i<N) break; /* 所试探的城市满足访问条件,找到新的可行城市,终止for循环*/ }if(i==N) /* 判断for循环是否是由于搜索完所有城市而终止的,如果是(i==N),进行回溯*/{// printf("here");getchar();depth--;currentDist-=m1[stack[depth]][stack[depth+1]];currentCost-=m2[stack[depth]][stack[depth+1]];visited[stack[depth+1]]=0;}else /* i!=N,表示for循环的终止是由于寻找到了当前城市的一个可行的邻近城市*/{//printf("%d %d %d %d %d %d\n",cur,i,m1[stack[depth]][i],m2[stack[depth]][i],currentCost,curre ntDist);//getchar();currentDist+=m1[stack[depth]][i]; /* 把从当前所处城市到所找到的可行城市的距离加入currentDist */currentCost+=m2[stack[depth]][i]; /* 把从当前所处城市到所找到的可行城市的代价加入currentCost */depth++; /* 所找到的可行城市进栈*/stack[depth]=i; /* 更新栈顶指针,指向所找到的可行城市*/stack[depth+1]=0;visited[i]=1; /* 修改所找到的城市的访问标志*/if(i==N-1) /* i==N-1表示访问到了乙城市,完成了所有城市的一次搜索,找到一条通路*/{// printf("here\n");for(j=0;j<=depth;j++) /* 保存当前找到的通路所经过的所有节点*/ bestPath[j]=stack[j];bestLength=depth; /* 保存当前找到的通路所经过的所有节点的节点数*/shortestDist=currentDist; /* 保存当前找到的通路的距离之和*/minimumCost=currentCost; /* 保存当前找到的通路的代价之和*///costBound=currentCost;distBound=currentDist; /* 更新剪枝的路径边界,如果以后所找到的通路路径之和大于目前通路的路径之和,就剪枝*/if(minimumCost>1500) continue; /* 如果当前找到的通路的代价之和大于1500,则放弃这条通路*/printf("最短路径:%3d,路径代价:%3d,所经历的节点数目:%3d,所经历的节点如下:\n",shortestDist,minimumCost,bestLength+1); /* 输出找到的通路的结果*/bestPath[bestLength]=49;for(i=0;i<=bestLength;i++) /* 输出所找到的通路所经过的具体的节点*/ printf("%3d ",bestPath[i]+1);(完整word版)北航研究生算法设计与分析Assignment_2 printf("\n");depth--; /* 连续弹出栈顶的两个值,进行回溯,开始寻找新的可行的通路*/currentDist-=m1[stack[depth]][stack[depth+1]];currentCost-=m2[stack[depth]][stack[depth+1]];visited[stack[depth+1]]=0;depth--;currentDist-=m1[stack[depth]][stack[depth+1]];currentCost-=m2[stack[depth]][stack[depth+1]];visited[stack[depth+1]]=0;// getchar();}}}}。

2022年北京工业大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年北京工业大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年北京工业大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、用有向无环图描述表达式(A+B)*((A+B)//A),至少需要顶点的数目为()。

A.5B.6C.8D.92、设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储, a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为()。

A.13B.33C.18D.403、连续存储设计时,存储单元的地址()。

A.一定连续B.一定不连续C.不一定连续D.部分连续,部分不连续4、在下列表述中,正确的是()A.含有一个或多个空格字符的串称为空格串B.对n(n>0)个顶点的网,求出权最小的n-1条边便可构成其最小生成树C.选择排序算法是不稳定的D.平衡二叉树的左右子树的结点数之差的绝对值不超过l5、已知串S='aaab',其next数组值为()。

A.0123B.1123C.1231D.12116、循环队列放在一维数组A中,end1指向队头元素,end2指向队尾元素的后一个位置。

假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。

初始时为空,下列判断队空和队满的条件中,正确的是()。

A.队空:end1==end2;队满:end1==(end2+1)mod MB.队空:end1==end2;队满:end2==(end1+1)mod (M-1)C.队空:end2==(end1+1)mod M;队满:end1==(end2+1) mod MD.队空:end1==(end2+1)mod M;队满:end2==(end1+1) mod (M-1)7、已知字符串S为“abaabaabacacaabaabcc”,模式串t为“abaabc”,采用KMP算法进行匹配,第一次出现“失配”(s!=t)时,i=j=5,则下次开始匹配时,i和j的值分别()。

A.i=1,j=0 B.i=5,j=0 C.i=5,j=2 D.i=6,j=28、已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历结果为()。

北京工业大学算法设计分析一纸开卷

北京工业大学算法设计分析一纸开卷

时间复杂性分析:以语句为单位;统计基本语句的执行次数;每执行一次,认为是一个时间单位。

O的定义:如果存在正常数c和自然数n0,使得当n≥n0时有f(n) ≤cg(n),则称函数f(n)当n充分大时上有界,且g(n)是它的一个上界,记f(n)= O(g(n))。

Ω的定义当n ≥n0时有f(n) ≥cg(n),记为f(n)=Ω(g(n))θ的定义:当n ≥n0时,c1g(n) ≤f(n) ≤c2g(n)则记f(n)= θ(g(n))。

即f(n)与g(n)同阶。

1.根据符号O的定义,存在正常数Ci和自然数Ni,使得对所有的n>=N有i=1.2,f(n)<=C1s(n),g(n) <=C2r(n)所以f(n)+ g(n) <= C1s(n)+ C2r(n),f(n)*g(n)<= C1C2s(n)r(n);令C3=max(C1,C2),C4=C1C2;则:f(n)+ g(n) <= C3[s(n)+ r(n)]=O(s(n)+ r(n))f(n)*g(n) <= C4*s(n)*r(n)=O(s(n)* r(n))分治算法的基本思想:是将一个规模为n的问题分解为a个规模较小的子问题,递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。

贪心算法的设计思路是:总是做出在当前看来最好的选择,即贪心算法并不是从整体最优考虑,它所做的选择只是在某种意义上的局部最优选择。

贪心法的基本要素:1. 贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。

2.最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

贪心算法与动态规划算法的差异:共同点:求解的问题都具有最优子结构性质。

差异点:动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。

北京工业大学人工智能一纸开卷复习试卷

北京工业大学人工智能一纸开卷复习试卷

在算法A中,当h(n)≤h*(n)时,称其为A* 算法. A* 算法具有如下的性质:
完备性:如果问题有解,则算法一定能找到解.(定理1.1、1.2)
可采纳性:如果问题有解,则算法一定能找到最佳解。

即算法总能找到一条从S 到目标节点的最佳路径. (定理1.3)
最优性:设A1和A2为某问题求解的两个A* 算法,若对所有非目标节点均有h1(n)〈h2(n)≤h*(n)则算法A1展开的节点数目至少和A2一样多。

(启发函数和A*算法的关系)(定理1.4)
8) 启发式图搜索的总结
h (n)=0,则f (n)= g (n),等同于分支界限法。

当g (n) = d (n), 等同于宽度优先。

保证可采纳性,但搜索效率很低.
当f(n)= g(n)+ w*h (n),w足够大,相当于g(n) = 0,变成爬山法,搜索效率高,有可能牺牲可采纳性.满足A* 算法,保持可采纳性,扩展节点少。

但需尽可能多的准确可靠的启发性知识,而且计算这样的启发函数需较大的工作量.
影响算法搜索性能的主要因素:路径的耗散值扩展的节点数目计算h 所需的工作量。

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

时间复杂性分析:以语句为单位;统计基本语句的执行次数;每执行一次,认为是一个时间单位。

O的定义:如果存在正常数c和自然数n0,使得当n≥n0时有f(n) ≤cg(n),则称函数f(n)当n充分大时上有界,且g(n)是它的一个上界,记f(n)= O(g(n))。

Ω的定义当n ≥n0时有f(n) ≥cg(n),记为f(n)=Ω(g(n))θ的定义:当n ≥n0时,c1g(n) ≤f(n) ≤c2g(n)则记f(n)= θ(g(n))。

即f(n)与g(n)同阶。

1.根据符号O的定义,存在正常数Ci和自然数Ni,使得对所有的n>=N有i=1.2,f(n)<=C1s(n),g(n) <=C2r(n)所以f(n)+ g(n) <= C1s(n)+ C2r(n),f(n)*g(n)<= C1C2s(n)r(n);令C3=max(C1,C2),C4=C1C2;则:f(n)+ g(n) <= C3[s(n)+ r(n)]=O(s(n)+ r(n))f(n)*g(n) <= C4*s(n)*r(n)=O(s(n)* r(n))分治算法的基本思想:是将一个规模为n的问题分解为a个规模较小的子问题,递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。

贪心算法的设计思路是:总是做出在当前看来最好的选择,即贪心算法并不是从整体最优考虑,它所做的选择只是在某种意义上的局部最优选择。

贪心法的基本要素:1. 贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。

2.最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

贪心算法与动态规划算法的差异:共同点:求解的问题都具有最优子结构性质。

差异点:动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。

动态规划算法:保存已解决的子问题的答案,在需要时找出已求得的答案,以避免大量的重复计算,从而得到多项式时间算法。

基本步骤:找出最优解的性质,并描述其结构特征。

递归地定义最优值。

以自底向上的方式计算出最优值。

根据计算最优值时得到的信息,构造最优解。

2.假设某算法在输入规模为n时的计算时间为:T(n)=3*2n ,在A 型计算机上实现并完成该算法的时间为t秒,现有更先进的B型计算机,其运算速度为A型计算机的64倍。

试求出若在先进的B型机上运行同一算法在则T秒内能求解输入规模为多大的问题?64*3*2^n=2^6*3*2^n=3*2^(n+6);T=T(n)=3*2^n n=log2(T/3)设新机器输入规模为n1,则:n1=log2(3*2^(n+6)/3)=n+6 3. 试说明为什么“在现代计算机上运行指数(如2n)时间算法是不可能的,要想在顺序处理机上扩大所处理问题的规模,有效的途径是降低算法计算复杂度的数量级,而不是提高计算机的速度”。

一个计算时间为Ο(1)的算法,它的基本运算执行的次数是固定的,因此,总的时间由一个常数(即,零次多项式)来限界,而一个时间为Ο(n2)的算法则由一个二次多项式来限界。

多项式时间关系为Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n n)指数时间关系为Ο(2n)<Ο(n!)<Ο(n n)。

当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊,对于任意的m≥0,总可以找到n0,当n≥n0时,有2n>nm。

因此,只要有人能将现有指数时间算法中的任何一个算法简化为多项式时间算法,那就取得了一个伟大的成就。

由这些结果可看出,当数据集的规模(即n的取值)很大时,要在现代计算机上运行具有比Ο(nlog2n)复杂度还高的算法往往是很困难的。

尤其是指数时间算法,它只有在n值取得非常小时才实用。

要想在顺序处理机上扩大所处理问题的规模,有效的途径是降低算法的计算复杂度的数量级,而不是提高计算机的速度。

1.试用简短的语言说明“建立一个问题复杂性的下界要比确定它的上界困难得多!”其复杂性上界是已知求解该问题的最快算法的费用,而复杂性下界只能通过理论证明来建立。

寻求某个问题的计算复杂性上界,只要研究一个算法的复杂性即可。

但是要寻求同一问题的计算复杂性下界,则必须考察所有的解决该问题的算法,证明一个问题的复杂性下界就需要证明不存在任何复杂性低于下界的算法。

2.满足何种性质的问题被称为称为NP完全问题?请简述研究NP完全问题的意义;(1)NP即是多项式复杂程度的非确定性问题。

而如果任何一个NP问题都能通过一个多项式时间算法转换为某个NP问题,那么这个NP问题就称为NP完全问题。

如果一个NP完全问题能在多项式时间内得到解决,那么NP中的每一个问题都可以在多项式时间内解决。

NP完全性理论的重要性:知道一个问题是NP完全的就给我们提供了有价值的信息,告诉我们采用什么样的途径可以是最富有成效的。

一定不要去优先寻找有效的、精确的算法。

现在比较适当的途径是集中精力致力于其他较低目标的方法。

寻找在大多数情况下看来能快速运算的算法,虽然不能保证它在任何情况下都能快速地运算。

或者你甚至可以放松问题的某些方面,寻找一个只能给出满足大部分要求的快速算法。

简言之,NP完全性理论的初步应用是帮助算法设计人员找到最有可能得到有用的算法的努力方向 3.简要阐述“论证某一问题的最优子结构性质”时的一般方法;最优解包含着其子问题的最优解。

这种性质称为最优子结构性质。

在分析问题的最优子结构性质时,首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。

利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。

最优子结构是问题能用动态规划算法求解的前提。

证明0/1背包问题满足最优子结构性质。

证明:假设(x1,x2,...,xn-1)不是最优解,而(y1,y2,...,yn-1)是最优解。

由此可知(写公式): 上述结果说明:(y1,y2,...,yn-1,xn)是所给0-1背包问题的更优解。

与前提矛盾。

4.对于一个具体问题,要确定它是否具有贪心选择性质,我们必须证明每一步所作的贪心选择最终导致问题的一个整体最优解。

首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。

而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。

然后,用数学归纳法证明,通过每一步作贪心选择,最终可得到问题的一个整体最优解。

社会名流问题:给定一个n×n邻接矩阵,确定是否存在一个i,其满足在第i列所有项(除了第ii项)都为1,并且第i行所有项(除了第ii项)都为0。

大致的算法思路:随便取一个非对角线元素,比如Array[i][j],如果Array[i][j]=0成立,则j不是社会名流,于是删去第j行和第j列。

同样,如果Array[i][j]=1成立,则删去第i行和第i列;总之,无论对应项取何值,都可以删去一行和一列,因此整个操作只耗费O(n)的时间。

重复此操作直至剩下最后一个元素。

最后,检验该元素是否为社会名流即可。

如果该元素不是,则该群人中不存在社会名流。

在最坏情况下用3n/2-2次的比较找出A中的最大值和最小值使用一个快速排序的迭代模型可以使原递归算法所需的栈空间总量减至O(logn)struct node{int low,high;}st[10000];void quicksort2(int data[],int s,int t){int top=-1,low,high; top++; st[top].low=s; st[top].high=t;while(top>-1){ low=st[top].low; high=st[top].high;top--; intw;if(low<high){w=split(data,low,high);//或者split2st[++top].low=low;st[top].high=w-1; st[++top].low=w+1;st[top].high=high; }}4.试说明如何修改快速排序算法,使它在最坏情况下的计算时间为O(nlgn)。

可以通过减少递归栈的使用进行优化,快速排序的实现需要消耗递归栈的空间,而大多数情况下都会通过使用系统递归栈来完成递归求解。

对系统栈的频繁存取会影响到排序的效率。

在数据量较大时,快速排序的复杂度为O(nlgn)。

当数据集较小时,快排的复杂度有向O(n^2)发展的趋势,此时不必继续递归调用快速排序算法,使用插入排序代替快速排序。

STL中sort就是用的快排+插入排序的,使得最坏情况下的时间复杂度也是O(nlgn).这一改进被证明比持续使用快速排序算法要有效的多。

struct node {int low,high;}st[10000]; void quicksort2(int data[],int s,int t){ int top=-1,low,high; top++; st[top].low=s; st[top].high=t; while(top>-1){ low=st[top].low; high=st[top].high;top--; int w; if(low<high){w=split(data,low,high);#include<stdio.h>#include<stdlib.h>#include "stdafx.h"#include <iostream>using namespace std;int V[200][200];//前i个物品装入容量为j的背包中获得的最大价值int max(int a,int b){if(a>=b)return a;else return b;}int KnapSack(int n,int w[],int v[],int x[],int C){int i,j,t,k,lager,a,b;int K[200][200]={0};for(i=0;i<=n;i++) //边界值 v(i,0)=v(0,j)=0;V[i][0]=0;for(j=0;j<=C;j++)V[0][j]=0;for(j=1;j<=C;j++) //矩阵V[n+1][C+1]for(i=1;i<=n;i++){if(j<w[i]) //物品i的质量大于背包容量{V[i][j]=V[i-1][j];K[i][j]=-1; //物品i放不下}else{t=j/w[i];lager=V[i-1][j]; //暂且认为V(i-1,j)为最优解,便于之后比较for(k=1;k<=t;k++){b=V[i-1][j-k*w[i]]+k*v[i];lager=max(lager,b); //最大价值}V[i][j]=lager;if(V[i][j] == V[i-1][j]){K[i][j]=0; //物品i能放下,但非最优解}else{for(k=1;k<=t;k++){if(V[i][j] == V[i-1][j-k*w[i]]+k*v[i]) break;}K[i][j]=k; //物品i放入k次为最优解}}}printf("matrix V[n][C] is:\n");for(i=0;i<=n;i++){for(j=0;j<=C;j++){printf("%3d ",V[i][j]);}printf("\n");}printf("matrix K[n][C] is:\n");for(i=0;i<=n;i++){for(j=0;j<=C;j++){printf("%3d ",K[i][j]);}printf("\n");}j=C;for(i=n;i>=1;i--){if(V[i][j]==V[i-1][j]){x[i]=0;}else{x[i]=K[i][j];j=j-K[i][j]*w[i];}}printf("最优装法为:\n");for(i=1;i<=n;i++)printf("%d ",x[i]);printf("\n");return V[n][C];}int main(int argc, char* argv[]){int s; //获得的最大价值int w[15]; //物品的重量int v[15]; //物品的价值int x[15]; //物品的选取状态int n,i;int C; //背包最大容量n=5;printf("背包的最大容量、可选物品种类:\n"); //scanf("%d%d",&C,&n);cin>>C>>n;printf("各物品的重量:\n");for(i=1;i<=n;i++)cin>>w[i];//scanf("%d",&w[i]);printf("各物品的价值:\n");for(i=1;i<=n;i++)cin>>v[i];//scanf("%d",&v[i]);s=KnapSack(n,w,v,x,C);printf("背包能装入的最大价值为:\n");printf("%d\n",s);system("PAUSE");return 0;}TSP问题:数学语言描述:设需要经过的城市为k=0,1,2,3,4;d(i, V’)=min{Cik +d(k, V’-{k})}Cik表示你选择的城市和城市i的距离,d(k, V’-{k})是一个子问题。

相关文档
最新文档