摘要: 描述:给定总金额为A 的一张纸币,现要兑换成面额分别为a1, a2,…, an 的硬币。硬币兑换问题是用最少枚数的硬币来兑换总金额为A 的纸币。如 a = {1, 2, 5},兑换6元则要2枚硬币(1和5)。根据特定的a,有可能可以直接用贪心算法每次都选取可用的最大硬币值。但对于一些例子,会出现错误情况。如 a = {1, 4, 5},兑换8元。若直接选取最大值,则需要4枚(1个5和3个1),但显然最优值应为2枚(2个4)。对于兑换n元的硬币的最优情况,可以遍历列表 a ,分别选取1个其面值的硬币,再从中挑出最优结果,此时 f(n) = min{f(n-ai)+1}。而每个之前算法的结果都可能 阅读全文
posted @ 2013-12-07 16:38 7hat 阅读(534) 评论(0) 推荐(0) 编辑
摘要: 问题:一个工厂有两条装配线a1, a2,每条装配线有n个装配站,每个编号对等的装配站功能相同。机器只要依次通过编号为1,2,...,n的装配站即可加工完成。已知两条装配线各个装配站装配所需的时间即a1,1,a1,2,...,a1,n, a2,1,a2,2,...,a2,n, 进入装配线所需时间e1,e2,离开装配线所需时间x1,x2。有时候为了加快装配进度,可以将部分完成的机器从一条装配线移到另一条装配线,所需时间分别为t1,1,t1,2,...,t1,n-1, t2,1,t2,2,...,t2,n-1. 求机器制造所需的最短时间。算法基本思路:1.计算最优解即最短时间;要求最短时间,可以看作 阅读全文
posted @ 2013-12-05 08:49 7hat 阅读(344) 评论(0) 推荐(0) 编辑
摘要: 定义:一个包含n个数的序列a0, a1, ... , an-1,求序列的最长非降(>=)子序列及其长度。如:序列5, 3, 4, 9, 6, 8,此最大非降子序列长度为4,子序列为3,4,6,8.(子序列也可能不唯一)运用动态规划,可以构造时间复杂度为O(n2)的算法。算法基本思路:1.打表,获取最长非降子序列的长度;要构造最长非降子序列,可知此序列一定是以序列中某个数作为结尾(好像是废话,但就是那样)。因此,构造表ml[0...n-1],ml[i] 表示前 i 个数以a[i] 为结尾的最长非降子序列的长度。枚举 j (0 ml[i]){ ml[i] =... 阅读全文
posted @ 2013-11-27 16:31 7hat 阅读(781) 评论(0) 推荐(0) 编辑
摘要: 背包问题:n种物品,每种物品有重量w和价值v,背包所能承受的最大重量为c。如何挑选物品可以使总物品的价值最大。0-1背包问题:限定每种物品的个数只能是0或1.如:5个物品,质量分别为3,5,7,8,9,价值分别为4,6,7,9,10。背包所能承受重量为22.给物品从0开始编号,挑选物品1,3,4(价值分别为6,9,10)时,总价值最大为25,此时重量为22.运用动态规划思想,可以构造有效的方法。算法基本思路:1.构造最优表,获取最大价值;构造表mv[0...n][0...c],mv[i][j] 表示 前 i 项物品(即0到i-1)中挑选物品放入承受重量为 j 的最大价值。显然,当 i 为0即没 阅读全文
posted @ 2013-11-27 15:44 7hat 阅读(590) 评论(0) 推荐(0) 编辑
摘要: 定义:设G是一个有向图,其中每条边(i, j)都有一个非负的长度L[i, j],若点i 到点j 没有边相连,则设L[i, j] =∞. 要找出每个顶点到其他所有顶点的最短路径所对应的长度。如:则,L: 0 2 9 8 0 6 1 ∞ 0运用Floyd-Warshall算法,时间复杂度为O(n3),空间复杂度为O(n2).算法基本思路:引理,点 i 到点 j 的最短路径可能是点 i 到点 j 的直接路径长度,也可能是以某点 k 为中间节点,i, k, j 的路径长度。采用自底向上逐步求解的方法,设D[i, j, k] 表示 点 i 到 j 以点集[0..k] 为中间节点的... 阅读全文
posted @ 2013-11-19 09:01 7hat 阅读(3979) 评论(2) 推荐(0) 编辑
摘要: 问题:n个矩阵M1M2……Mn链乘法的耗费,取决于n-1个乘法执行的顺序。现在要找到其最小次数的乘法执行顺序。如,n = 4,有以下可能的顺序:(M1(M2(M3M4)))(M1((M2M3)M4))((M1M2)(M3M4))(((M1M2)M3)M4)((M1(M2M3))M4)如果使用暴力算法枚举,时间复杂度为O(2n)。运用动态规划技术,可以将时间复杂度降为O(n3).算法基本思路:1.得到最小乘法次数(1)将矩阵序列在其中找出某个k位置,将其分为两部分;分别求出这两部分的最优解,然后再将其加上这两部分相乘的耗费,就是用当前划分所需要的乘法次数;依次枚举按k划分,比较并取最小乘法次数。 阅读全文
posted @ 2013-11-17 20:16 7hat 阅读(821) 评论(0) 推荐(1) 编辑
摘要: 问题:给定两个字符串,求出它们的最长公共子序列的长度。如:a = "xzyzzyx", b = "zxyyzxz",则其最长公共子序列的长度为4,"zyyx".注意:最长公共子序列不一定要连续(连续的叫最长公共子串),最长公共子序列也可能不唯一。如上面也可以是:"xyyx".穷举一般都能解决问题,但效率过低(指数时间),这个在密码学上叫计算上不可行。我们可以运用动态规划的思想,可以在多项式时间内解决。算法基本思路:1.求最长公共子序列的长度。给定字符串 a 和 b,可知它们的长度 alen 和 blen。设有二维数 阅读全文
posted @ 2013-11-14 09:51 7hat 阅读(1560) 评论(0) 推荐(0) 编辑
摘要: 问题:设S是平面上n个点的集合,考虑在S种找到一个点对p和q,使其距离最短。求出其最短距离。暴力检查每个点对并记录距离后可以选出最短距离,但时间复杂度是O(n2)。这里可以运用一种分治的算法,使得时间复杂度降为O(nlogn)。算法基本思路:1.将所有点排序,优先考虑x,若x相等,则考虑y;2.找到中间位置,将集合一分为二,在左边范围内求出最短距离L,在右边范围内求出最短距离R(集合一直划分至三个点后,直接暴力求解);3.现在考虑左边的点和右边的点组合能否产生更短的距离。因为现在知道L和R,求出两者中的较小值M,在中间位置各取左边M距离和右边M距离的空间,把其中的左边的点与右边的点暴力求距离值 阅读全文
posted @ 2013-11-12 20:04 7hat 阅读(385) 评论(0) 推荐(1) 编辑
摘要: 定义:序列中的多数元素是指在一个元素个数为n的序列中,多数元素出现次数大于[n/2].寻找元素方法很多:1.可以暴力搜索,将每个元素都与其他元素作比较,然后统计该元素出现的次数,时间复杂度为O(n2);2.可以先排序,然后再统计每个元素出现的次数,时间复杂度为O(nlogn);3.可以寻找中间值元素,因为多数元素在序列中必为中间值元素,时间复杂度是O(n);(寻找中间值元素可以运用寻找第k小元素算法:http://www.cnblogs.com/7hat/p/3411756.html)这里要介绍第4种方法,时间复杂度也是O(n),但是隐藏常数会比寻找中间值的方法要小。算法基于以下观察:在原序列 阅读全文
posted @ 2013-11-10 09:28 7hat 阅读(2036) 评论(0) 推荐(0) 编辑
摘要: 要在一个序列里找出第K小元素,可以用排序算法,然后再找。可以证明,排序算法的上界为O(nlogn)。在这里,给出两种可以在线性时间内找出第K小元素的方法。方法1:(1) 选定一个比较小的阈值(如44),当序列元素小于阈值时,直接用排序算法来做;(2) 当序列元素大于阈值时,把元素划分为以5个元素为一组,每一组元素自身作排序,然后挑出每一组元素的中间值,再在所有的中间值中,递归调用本算法,挑出中间值,可以认为,此值大约为整个序列的中间值(当序列元素个数不是5的倍数时,最后一组不足5的舍掉,这个对中间值影响不大);(图片参考《ALGORITHMS DESIGN TECHNIQUES AND ANA 阅读全文
posted @ 2013-11-07 09:22 7hat 阅读(3740) 评论(2) 推荐(0) 编辑