- 博客(12)
- 收藏
- 关注
原创 装载问题
1.问题有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且∑wi <= c1 + c2。问是否有一个合理的装载方案,可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。2.解析如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。(1)首先将第一艘轮船尽可能装满;(2)将剩余的集装箱装上第二艘轮船。将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近c1。由此可知,装载问题等价于以下特殊的0-1背包问题:max
2021-06-21 21:10:27
1068
原创 图的m着色问题
1.问题图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。2.解析可以使用回溯算法来解决问题。设G有n个顶点,将顶点编号为1, 2, … n,则搜索空间为深度n的m叉完全树,将颜色编号为1,2, .,m,结点<x1,x2…,xk >(x1,x2…,xk∈{1,…,m},1≤k≤m)表示顶点1的颜色x1,顶点2的颜色x2,…,顶点k的颜色xk。从第一个点开始
2021-06-21 15:53:17
231
原创 最优前缀码
1.问题给定字符集C={x1,x2,…,xn}和每个字符的频率f(xi),求关于C的一个最优前缀码。2.解析由哈夫曼树求得的编码为最优前缀码。每个叶子表示的字符的编码,就是从根到叶子的路径上的标号 依次相连所形成的编码,显然这就是该字符的最优前缀码。所谓前缀码是指,对字符集进行编码时, 要求字符集中任一字符的编码都不是其它字符的编码的前缀,比如常见的等长编码就是前缀码。所谓 最优前缀码是指,平均码长或文件总长最小的前缀编码称为最优的前缀码(这里的平均码长相当于码 长的期望值)。1.每个叶子字符ci的
2021-06-21 15:44:57
1123
原创 LCS算法和背包算法
1.问题LSC:求两串最长相同的子串0/1背包:V体积的背包,有N个物品 ,每个物品都有自己的体积和重量,问该背包能装 的最大 质量。2.解析LCS:背包:3.设计//lsc算法for(i=1;i<=lena;++i){for(j=1;j<=lenb;++j){if(a[i-1]==b[j-1])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}//背包算法for(int i=
2021-06-21 13:23:47
129
原创 矩阵链乘法
1.问题给定n个矩阵的链<A 1 ,A 2 ,…,A n >,其中i=1,2,…,n,矩阵A i的维数为p i-1 ×p i 。求一个完全“括号化方案”,使得计算乘积A 1 A 2 …A n 所需的标量乘法次数最小2.解析我们采用自底向上表格方法来代替上述递归公式算法来计算最优代价。过程中假定矩阵A的规模为Pi-1Xpi,输入是一个序列p=<p0,p1,…,pn>,长度为p.length = n+1.其中使用一个辅助表m来记录代价m[i,j],另一个表s来记录分割点的位置信息,
2021-06-21 13:06:59
121
原创 投资问题
1.问题一般性描述:设m元钱,n项投资,函数fi(x)表示将x元投入第i项项目所产生的效益,i=1,2,…,n问:如何分配这m元钱,使得投资的总效益最高?组合优化问题:假设分配给第i个项目的钱数是Xi,问题描述为:目标函数 max{f1(x1)+f2(x2)+…+fn(xn)}约束条件 x1+x2+…+xn=m,xi∈N2.解析递推公式设Fk(x)表示x万元投给前k个项目的最大效益,k=1,2,…,n,x=1,2,…,m第k步,前后共分配x万元分配给第k个项目为xk;x-xk万元
2021-06-21 12:55:24
205
原创 特定分治策略
1.问题在给出的n个数中,找到第k小的数。2.解析以S中的某个元素m作为划分标准,将S划分为两个子数组S1和S2,把这个数组中比m小的都放 入S1的数组中,数组S1的元素个数是|S1|个;把这个数组中比m*大的都放入S2的数组中,数组S2 的元素个数是|S2|个。若k<|S1|,则原问题归纳为在数组S1中找第k小的子问题。若k=|S1|+1,则m*就是要找的第k小元素。若k>|S1|+1,则原问题归纳为在数组S2中找第n−|S1|−1小的子问题。3.设计令q=[p/5](向下取
2021-06-21 12:46:42
72
原创 最近对问题-分治法
1.问题最近对问题要求在包含有n个点的集合S中,找出距离最近的两个点。设 p1(x1,y1),p2(x2,y2),……,pn(xn,yn)是平面的n个点。严格地将,最近点对可能不止一对,此例输出一对即可。2.解析在利用分治法思想解决此问题时,首先考虑将最近对问题进行分治,设计其分治策略。将集合S分成两个子集S1和S2,根据平衡子问题原则,每个子集中的点数大致都为n/2。这样分治后,最近点对将会出现三种情况:在S1中,在S2中或者最近点对分别在集合S1和S2中。利用递归分析法分别计算前两种情况,第
2021-06-21 12:39:54
698
原创 二分排序
1.问题二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。2.解析3.设计void merge_sort(int l, int r){if (l == r)return; //拆分成单个数,返回 int mid = (l + r) / 2;//二分merge_sort(l, mid);//对前半部分进行归并排序merge_sort(mid + 1, r);//对后半部分进行归并排序int p = l, i = l, j = mid + 1;whil
2021-06-21 09:11:53
303
原创 检索算法
1.问题在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0。2.解析算法一:遍历检索数组T为有序(这里假设为升序)数组,因此可通过一次遍历,当T[i] > x时,若仍没有找到x,则说明T数组中不存在x;若遍历发现T[k] == x(k < i),则输出k。算法二:二分检索二分查找是一种效率较高的查找方法,但要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。二分检索可通过不断二分数组从而缩小查找x的区间。3.设计算法一:
2021-06-21 08:59:45
736
原创 Floyd求最短距离
1.问题用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离(顶点之间的 最短距离矩阵),按实验报告模板编写算法。2.解析Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB) < Dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置D
2021-03-15 15:48:36
259
原创 Kruskal最小生成树
1.问题在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。要求给出一个连通网,寻找最小生成树。2.解析使用Kruskal算法,即“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小 代价边,加入到最小生成树的边集合里。把图中的所有边按代价从小到大排序;把图中的n个顶点看成独立的n棵树组成的森林;按权值从小到大选择边,所选的边连接的两个顶点ui,viui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。重复(3),直到所有顶
2021-03-14 22:56:43
90
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人