作为科班毕业的程序员,在下的代码能力感觉都是笑话。痛定思痛,决定啃一啃算法。发现好像都是大学的课本知识,摸摸头…尴尬。
当然不能一口吃一个胖子,这些仅作为入门学习
常用算法设计思想
常见分类
迭代法、贪婪法、穷举法搜索法、递推法、递归法、回溯法、分治法、动态规划法。
贪婪法 — 贪心算法
这种方法模式一般将求解过程分成若干个步骤,但每个步骤都最贪心,选择当前状态下收益最大,局部最有利的选择,并以此认定最后的结果也是最好的(最大的)
特点
贪婪法和动弹规划以及分治法一样,都需要对问题进行分解,定义最优解的子结构。
与其他方法不同之处在于,每一步选择完局部最优解就确定了,不再进行回溯了,也就是说,每个步骤确定后就不再修改了,直到算法结束。
但也因此很少情况下能得到最优解。
设计思想步骤
- 建立对问题精准描述的数学模型,包括定义最优解的模型
- 将问题分解为一系列的子问题,同时定义子问题最优解结构。
- 引用贪心原则确定每个子问题的局部最优解,并根据其模型,用子问题局部模型堆叠出全局最优解
下面就是案例啦!累死我了
贪婪法例子:0-1背包问题
【问题描述】:有一个背包,最多能承载重量为 C=150 的物品,现在有 7 个物品(物品不能分割成任意大小),编号为 1~7,重量分别是 wi=[35、30、60、50、40、10、25],价值分别是 pi=[10、40、30、50、35、40、30],现在从这 7 个物品中选择一个或多个装入背包,要求在物品总重量不超过 C 的前提下,所装入的物品总价值最高。
常见的三种贪婪策略
1.根据物品价值选择,每次都选价值最高的物品
依次装入4,2,6,5,总重量是130,价值是165
2.根据物品重量选择最轻的物品,直到超过150
一次装入6,7,2,1,5,总重量140,总价值155
3.定义一个价值密度感念,SI=物品价值PI/物品重量WI
依次装入6,2,7,4,1,总重量150,价值170
三个方法都是正确的,但是第三种很明显模型设计的更好,所以效果很明显。
编程大赛的战旗游戏,贪心算法很明显被狠虐。实在是模型不太会设计。同样的模式老员工的建模会将各种欠款都考虑进去。所以,对战时候就像一个带眼睛一样。说多都是累啊,真累!!!