算法分析
文章平均质量分 66
cmhummer
这个作者很懒,什么都没留下…
展开
-
最优装载问题
问题描述:有一批集装箱要装上一艘载重量为C的轮船,要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。算法分析:采用重量轻者先装的贪心选择策略,可产生最优装载问题的最优解。 算法实现:OptinalLoading.java/* * 最优装载 * 有一批集装箱要装上一艘载重量为C的轮船。 * 要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。...原创 2010-12-12 11:13:16 · 156 阅读 · 0 评论 -
喝汽水问题
问题描述:1元钱一瓶汽水,喝完后两个空瓶换一瓶汽水,问:你有20元钱,最多可以喝到几瓶汽水?这个问题其实是个比较典型的递推问题,每2个空瓶都可以再换1瓶新的汽水,这样一直递推下去,直到最后不能换到汽水为止。解法一:/* * description: * 1元钱一瓶汽水,喝完后两个空瓶换一瓶汽水,问:你有20元钱,最多可以喝到几瓶汽水? * * auther: cm...原创 2010-11-28 21:51:03 · 158 阅读 · 0 评论 -
最大子段和(三)
最大子段和问题解法三:算法分析:对于序列a,设j代表当前序列的终点,i代表当前序列的起点分析:如果a[i]是负的,那么它不可能是最大子段的起点,因为任何包含a[i]为起点的子段都可以通过 用a[i+1]为起点而得到改进。类似的,任何负的子段都不可能是最优子段的前缀(原理相同). 如果在循环中检测到a[i]到a[j]的子段是负的,那么可以推进i.结...原创 2010-11-21 10:04:31 · 144 阅读 · 0 评论 -
最大子段和(二)
最大子段和问题 解法二:分治法算法分析:最大子段和可能在三处出现。1)整个出现在输入数据的左半部2)整个出现在右半部。 3)跨越输入数据的中部从而位于左右两半部分之中前两种情况可以递归求解,第三种情况的最大和可以通过求出前半部分的最大和(包含前半部分的最后一个元素)以及后半部分的最大和(包含后半部分的第一个元素)而得到,前后两部分和相加。三部分中的最大者,即...原创 2010-11-20 19:15:53 · 117 阅读 · 0 评论 -
最大子段和(一)
问题描述:给定n个整数(可能为负数)组成的序列a1,a2,a3,...,an, 求该序列子段和的最大值例如:X={-2, 11, -4, 13, -5, -2}, 其最大子段和为20最大子段为:11,-4,13解法一:穷举法列举所有的可能,求其中的最大值算法实现如下:/* * description: 最大子段和问题 * 问题描述:给定n个整数(可能为负数)...原创 2010-11-20 10:31:48 · 119 阅读 · 0 评论 -
动态规划之最长单调递增子序列
问题描述:找出由n个数组成的序列的最长单调递增子序列解法一:原序列记为X,对n个数递增排序,构造一个新序列Y, 对X,Y求其最长公共子序列即可./* * description: 最长单调递增子序列 * 问题描述: * 找出由n个数组成的序列的最长单调递增子序列 * 算法设计: * 解法一: * 原序列记为X,对n个数递增排序,构造一个新序列Y, 对X,Y求...原创 2010-11-18 22:33:56 · 207 阅读 · 0 评论 -
动态规划之最长公共子序列
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。若给定序列X={x1, x2, ..., xm},则另一序列Z={z1, z2, ..., zk},X的子序列是指存在一个严格递增下标序列i, 使得对于所用的j=1, 2, 3,...,k有zj = xi.例如:序列X={A, B, C, B, D, A, B}的一个子序列Z={B, C, D, A}。给定两个序列X和Y, 当另一序...原创 2010-11-18 14:25:09 · 108 阅读 · 0 评论 -
矩阵连乘问题
/* description: * * 动态规划算法之矩阵连乘问题 * 1)矩阵Ai*Ai+1*...*Aj简记为A[i:j],所需的最小计算次数为m[i][j]. * 2)当i=j时,m[i][j] = 0 * 3)当 i<j时,假设使m[i][j]最小的最优次序是在Ak和Ak+1之间断开, * 则m[i][j] = m[i][k]+m[k+1][j]+p[i-1]...原创 2010-11-16 21:39:27 · 157 阅读 · 0 评论 -
二分搜索法的简单实现
二分搜索算法是运用分治策略的典型例子。基本思想:将n个元素分成大致相同的两半,取a[n/2]与x进行比较。如果x==a[n/2],则找到,算法终止。如果a[n/2]>x,则只要在数组的左半部分继续搜索x.如果x>a[n/2],则只要在数组的右半部分继续搜索。 算法简单实现如下://二分搜索法public class BinarySearch { /* 采用二...2010-10-20 09:11:34 · 232 阅读 · 0 评论 -
最小生成树之Prim算法
Prim算法Java朴素版//Prim算法求最小生成树,使用Java语言的简单实现// 图用邻接矩阵存储import java.util.*;public class PrimMST { private static int MAX = Integer.MAX_VALUE; public static int prim(int graph[][], int n)...2010-10-16 22:45:55 · 111 阅读 · 0 评论 -
背包问题
与0-1 背包问题类似,所不同的是在选择物品i 装入背包时,可以选择物品i 的一部分,而不一定要全部装入背包.算法分析:首先计算每种物品的单位重量的价值, 然后依贪心策略,将尽可能多的单位重量价值最高的物品装入背包.实现:/* * description: 背包问题 * 问题描述:与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择 * 物品i的...原创 2010-12-14 18:27:51 · 181 阅读 · 0 评论 -
0-1背包问题
0-1背包问题:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的总容量为c。问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包,因此该问题称为0-1背包问题。 该问题的形式化描述是: 0-1背包问题具有最优子结构性质,可用动态规划法解决。解法一:动态规划算法分...原创 2010-12-14 18:00:13 · 222 阅读 · 0 评论 -
装载问题
装载问题有一批共n个集装箱要装上两艘载重量分别为c1和c2的轮船,集装箱总重量小于等于c1+c2,要求定一个合理的装载方案可将这n个集装箱装上这两艘轮船。可以证明,如果一个给定装载问题有解,则采用下面的策略可得到最优的装载方案:1)首先将第一艘轮船尽可能装满2)将剩余的集装箱装上第二艘轮船 将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和接近第...原创 2010-12-12 18:16:05 · 248 阅读 · 0 评论 -
求组合数
求组合数从n个数里面取m个数 (递归实现)/** * Description: * 求组合数(递归法) * 从n个数里面取m个数 算法分析: * 用递归的方法,每选出一个数字之后就把这个数字去掉,用剩余的数字继续递归 * @author cm * */public class Combination { private int m; priv...原创 2011-03-26 20:23:07 · 137 阅读 · 0 评论