6. 河南省实验中学 常庆卫 Dis[X]: 为城市 X 到 E 的最短路线的长度;( X 表示任意一个城市) Map[I,J]: 表示 I , J 两个城市间的距离,若 Map[I , J]=0 ,则两个城市不连通。 用深度优先搜索来做:
7. 河南省实验中学 常庆卫 Var Se: 未访问的城市集合; Function Long(Who: 当前访问城市 ):Integer; 求当前访问城市与城市 E 的最短距离。 Begin If Who=E Then Long:=0 Else Begin Min:=Maxint; For I 取遍所有城市 Do If ( Map[Who,I]>0 ) And (I In Se) Then Begin Se:=Se-[I]; J:=Map[Who,I]+Long(I); Se:=Se+[I]; If J<Min Then Min:=J; End; Long:=Min; End; End;
8. 河南省实验中学 常庆卫 Begin Se:= 除 A 外所有城市的集合; Dis[A]:=Long(A); End. 时间复杂度 :O(n!)
9. 河南省实验中学 常庆卫 在求从 B1 到 E 的最短路径的时候,先求出从 C2 到 E 的最短路径;而在求从 B2 到 E 的最短路径的时候,又求了一遍从 C2 到 E 的最短路径。也就是说,从 C2 到 E 的最短路径我们求了两遍。同样可以发现,在求从 C1 、 C2 到 E 的最短路径的过程中,从 D1 到 E 的最短路径也被求了两遍。而在整个程序中,从 D1 到 E 的最短路径被求了四遍 .
11. 河南省实验中学 常庆卫 我们可以用 阶段 作为每个城市的次序,然后从阶段 3 倒推至阶段 1 ,再推出 Dis[A] 。 公式: Dis[X]=Min{ Dis[Y]+Map[X,Y]} Y 是下一个阶段中与 X 相连通的城市 注:可以把 E 看成第 4 个阶段, A 看成第 0 个阶段。
12. 河南省实验中学 常庆卫 Dis[E]=0 For X= 阶段 3 的每个城市 Downto 阶段 0 的每个城市 Do Begin Dis[X]:=Maxint; For Y= 阶段 X 的下一个阶段中的每个城市 Do If Dis[Y]+Map[X,Y]<Dis[X] Then Dis[X]:=Dis[Y]+Map[X,Y]; End. 时间复杂度 :O(n 2 )
13. 河南省实验中学 常庆卫 有 4 个点,分别是 A 、 B 、 C 、 D ,如图所示,相邻两点用两条连线 C2k,C2k-1(1≤k≤3) 表示两条通行的道路。连线上方的数字表示道路的长度。我们定义从 A 到 D 的所有路径中,长度除以 4 所得余数最小的路径为最优路径。求一条最优路径。
39. 河南省实验中学 常庆卫 初始化 data[i,1] 数列 data[i,2] 1 data[i,3] 0 输出结果 For i n-1 down 1 do L 0;k 0; For j i+1 to n do (data[j,1]>data[i,1])and(data[j,2]>L) Y N L data[i,2];k j; Y N Data[i,2] L+1;data[i,3] k L>0
72. 河南省实验中学 常庆卫 设 f(i,j,s) 表示从 A i 到 A j , s 个乘号取得的最大值。 f(i,j) 表示从 A i 到 A j 的数字最大列 f(1,n,k)=max{f(1,n-1,k-1)*g(n,n), f(1,n-2,k-1)*g(n-1,n),…, f(1,k,k-1)*g(k+1,n)} 1 2 3 4 5 6 7 8 9 0 3 32 321 3210 32104 321044 3210441 32104410 321044105 1 6 63 630 12840 128416 2 6 60 2520 51360 526440 3 0 240 10080 103320 1033200 4 0 960 10080 10080 5166000
73. 河南省实验中学 常庆卫 一个作曲家作了 n 首歌曲,标号从 1—n( 按作曲时间排列 ) ,现在要出版这位作曲家的部分歌曲,计划用 m 张碟片出版,每张碟片长度为 t, 歌曲必须按照作曲时间选曲,即第一张碟选了 1 、 3 ,第二张碟就只能从 4 开始选。问如何选曲才能使所选歌曲数量最多,最多歌曲数量是多少? 输入: n , m , t , n 首歌曲的长度 输出:最多歌曲数量
74. 河南省实验中学 常庆卫 设一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,…,n ),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di , tree 及它的每个子树都有一个加分,任一棵子树 subtree (也包含 tree 本身)的加分计算方法如下: subtree 的左子树的加分 × subtree 的右子树的加分+ subtree 的根的分数 若某个子树为空,规定其加分为 1 ,叶子的加分就是叶节点本身的分数。不考虑它的空子树。 试求一棵符合中序遍历为( 1,2,3,…,n )且加分最高的二叉树 tree 。要求输出; ( 1 ) tree 的最高加分 ( 2 ) tree 的前序遍历 加分二叉树
95. 河南省实验中学 常庆卫 某商店有 n 类物品,第 i 类物品价值为 P i ,重量为 W i ,背包最大能承受的重量为 G 。其中 P i 和 W i 和 G 都为非负整数。目标是如何选择装入背包的物品,使装入背包的物品总价值最大。每类物品可选任意数量 (可以是一部分) 放入背包。 背包问题 部分
96. 河南省实验中学 常庆卫 部分背包问题 注意 : 式中是中括号,表示区间 其中 X i 表示:该类物品装入背包的重量与该类物品总重的比值, X i =0 表示没有第 i 种物品放到背包中; X i =1 表示将第 i 种物品全部放到背包中。 可将这个问题形式描述如下: 求 约束条件为
97. 河南省实验中学 常庆卫 部分背包问题 注意 : 式中是中括号,表示区间 其中 X i 表示:该类物品装入背包的重量与该类物品总重的比值, X i =0 表示没有第 i 种物品放到背包中; X i =1 表示将第 i 种物品全部放到背包中。 可将这个问题形式描述如下: 求 约束条件为
99. 河南省实验中学 常庆卫 贪心算法 样例分析: i 1 2 3 4 5 W i 30 10 20 50 40 P i 65 20 30 60 40 P i / W i 2.1 2 1.5 1.2 1
100. 河南省实验中学 常庆卫 procedure main; var i:longint;x,c:real; begin x:=0;c:=G;i:=1; while (w[i]<=c)and(i<=n) do begin x:=x+p[i]; c:=c-w[i]; i:=i+1; end; if i<=n then x:=x+c/w[i]*p[i]; end;
101. 河南省实验中学 常庆卫 在 n 件物品取出若干件放在空间为 m 的背包里,每件物品的重量为 W 1 , W 2 ……W n ,与之相对应的价值为 P 1 ,P 2 ……P n 。求出获得最大价值的方案。 注意:在本题中,所有的重量值均为整数。 背包问题 0/1
102. 河南省实验中学 常庆卫 0/1 背包问题 注意 : 式中是大括号,表示值表 其中 X i 表示:该件物品装入背包与否 X i =0 表示没有将第 i 种物品放到背包中; X i =1 表示将第 i 种物品放到背包中。 可将这个问题形式描述如下: 求 约束条件为