总结
- 分治法特征:把一个问题拆分成多个小规模的相同子问题,一般可用递归解决。
- 经典问题:斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔
- 回溯法特征:系统的搜索一个问题的所有解或任一解。
- 经典问题:N皇后问题、迷宫、背包问题
- 动态规划法(用于求最优解):划分子问题,并把子问题结果使用数组散列表存储,利用查询子问题结果构造最终问题
- 经典问题:斐波那契数列、矩阵乘法、背包问题、LCS最长公共子序列
- 贪心法(用于求满意解)特征:局部最优,但整体不见得最优。每步有明确的,既定的策略。
- 经典问题:背包问题、多机调度、找零钱问题
真题
【2016】考虑一个背包问题,共有=5个物品,背包容量为W=10,物品的重量和价值分别为:w={2,2,6,5,4,V={6,3,5,4,6},求背包问题的最大装包价值。若此为0-1背包问题,分析该问题具有最优子结构,定义递归式为
其中c(i,j)表示i个物品、容量为j的0-1背包问题的最大装包价值,最终要求解c(n,W)。采用自底向上的动态规划方法求解,得到最大装包价值为(62),算法的时间复杂度为(63)。若此为部分背包问题,首先采用归并排序算法,根据物品的单位重量价值从大到小排序,然后依次将物品放入背包直至所有物品放入背包中或者背包再无容量,则得到的最大装包价值为(64),算法的时间复杂度为(65)。
A. 11
B. 14
C. 15
D. 16.67
A. O(nW)
B. O(nlogn)
C. O(n2)
D. O(nlognW)
A. 11
B. 14
C. 15
D. 16.67
A. O(nW)
B. O(nlogn)
C. O(n2)
D. O(nlognW)
答案C A D B
背包问题:在有限的条件里面装尽可能多价值的物品
- 0-1背包问题:物品不能拆解。
- 先找最大价值
最大的是6,有两个分别对应的背包个数是是2和4,剩余背包10-(2+4)=4,只能放在价值3的2个背包。所以总价值就是6+6+3=15- 找单位价值
cost={6/2=3,3/2=1.5,5/6,4/5=0.8,6/4=1.5},最大的是3和1.5- 穷举法
- 部分背包问题:物品可拆解
从大小排序cost={6/2=3,3/2=1.5,6/4=1.5,5/6,4/5=0.8}
6+3+6+5/6*2
归并排序算法时间复杂度就是nlogn
【2012】63-64、某货车运输公司有一个中央仓库和个运输目的地,每天要从中央仓库将货物运输到所有运输目的地,到达每个运输目的地一次且仅一次,最后回到中央仓库。在两个地点和j之间运输货物存在费用Cij。为求解旅行费用总和最小的运输路径,设计如下算法:首先选择离中央仓库最近的运输目的地1,然后选择离运输目的地1最近的运输目的地2,…,每次在来访问过的运输目的地中选择离当前运输目的地最近的运输目的地,最后回到中央仓库。该算法采用了_63_算法设计策略,其时间复杂度为_64_
63、
A.分治
B.动态规划
C.贪心
D.回溯
64、
A.o(n2)
B.o(n)
C.o(nlogn)
D.o(1)
答案C A
第一次中心仓库找最近的需要n次,第二个找最近的是n-1,以此类推n+(n-1)+(n-2)+…,但是这样是没有答案的。最差的情况就是没到一个地方都会计算全部的路径就是有n个地方就要计算n次路径即n+n+n…
【2018】在一条笔直公路的一边有许多房子,现要安装消防栓,每个消防栓的覆盖范围远大于房子的面积,如下图所示。现求解能覆盖所有房子的最少消防栓数和安装方案(问题求解过程中,可将房子和消防栓均视为直线上的点)。
该问题求解算法的基本思路为:从左端的第一栋房子开始,在其右侧米处安装一个消防栓,去掉被该消防栓覆盖的所有房子。在剩余的房子中重复上述操作,直到所有房子被覆盖。算法采用的设计策略为();对应的时间复杂度为()。
假设公路起点A的坐标为0,消防栓的覆盖范围(半径)为20米,10栋房子的坐标为(10,20,30,35,60,80,160,210,260,300),单位为米。根据上述算法,共需要安装()个消防栓。以下关于该求解算法的叙述中,正确的是()。
(A)分治
(B)动态规划
(C)贪心
(D)回溯
(A)o(lgn)
(B)o(n)
(C)o(nlgn)
(D)o(n2)
(A)4
(B)5
(C)6
(D)7
(A)肯定可以求得问题的一个最优解
(B)可以求得问题的所有最优解
(C)对有些实例,可能得不到最优解
(D)只能得到近似最优解
答案C B B C
每一栋房子都需要检测是否满足条件,一共有N栋房子,所以是o(n)