算法思想
贪心算法
分而治之(递归思想)
动态规划
暴力穷举
贪心算法有哪些算法?
思考:
假设有四种硬币,面值分别为50元、10元、5元和1元。
现在要找给某顾客113元,你会怎么找?
我们不假思索的就会选择2个50元,1个10元和3个1元的组合。
而我们的下意识的使用了找硬币算法:
1. 首先选取一个不大于113元的最大面值,即50元,剩余63待找。
2. 再选取一个不大于63元的最大面值,即又一个50元,剩余13待找
3. 再选取一个不大于13元的最大面值,即10元,剩余3待找
4. 剩下就是3个1元的硬币
贪心算法图解?我们每次都在范围内选最大价值的硬币,这样的方法实际上就是贪心算法。
什么是贪心?
局部最优,不考虑整体最优
每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致全局结果是最好或最优的算法。
特点
优点:做决策所需的计算复杂度较低
缺点:贪婪、鼠目寸光,最终得到的解不一定是最优解
如果硬币的面值改为1元、5元和11元3种,需要找给顾客15元呢?
贪心算法模型。这个时候我们如果用贪心策略,得到的结果应该是1个11元+4个1元
但其实最优解是:3个5元!
所以说贪心最终得到的解不一定是最优解,但可能是近似最优解
典型应用:找硬币、区间调度(活动安排)问题、普通背包问题、多机调度问题、Dijkstra等等
没有固定的套路和题型,贪心只是提供一种解题思路,手动模拟一下,如果找不出反例,就可以试试贪心~
第一步:明确什么是最优解
第二步:明确子问题的最优解(重点:找策略)
第三步:分别求出子问题的最优解,再堆叠出全局最优解
题目:
有一个背包,背包容量是M=150。
现有7个物品,要求尽可能让装入背包中的物品总价值最大,但不能超过总容量,物品可分割。
三步走:
第一步:明确什么是最优解
据题可知,选择某些物品的情况下,不超过重量范围(总m <=150)且物品总价值最大
第二步:明确子问题的最优解
子问题:每次选择一个物品放入背包
子问题最优解策略:
第三步:分别求出子问题的最优解,再堆叠出全局最优解
综上,“利用价值密度选取物品”是这道普通背包题的局部最优解策略。
如果我们沿用以上背包问题贪心的最优策略,放在 0-1背包问题1 中呢?
题目:
现有背包容量M=50,有如下三个物品,物品不可分割,怎样让装入背包中的物品总价值最大?
物品1 | 物品2 | 物品3 | |
---|---|---|---|
重量 | 10 | 20 | 30 |
价值 | 60 | 100 | 120 |
物品1:6元/kg,物品2:5元/kg,物品3:4元/kg
依照价值密度规则,物品1最高。但首选物品1却不能获得最优解:
面对0-1背包问题,即使再优秀的贪心策略,也没有办法保证得到最优解。
因为无法保证最终能将背包装满,部分背包空间的闲置使每千克背包空间所具有的价值降低了
追求高价值(性价比)的物品是我们想要的,但同时不浪费过多背包的容积也是需要的
题解:leetcode题解——贪心
在0-1背包题中,对于一个物品,往往只有两个结果,要么选择1,要么放弃0。
考虑0-1背包物品选择时,应比较0和1所导致的最终结果,再作出最好选择。由此就导出许多互相重叠的子问题。这正是该问题可用动态规划算法求解的另一重要特征 ↩︎
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
下面的StudentService.java实现了 通过JDBC对表STUDENTS的SELECT 和INSERT操作:
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态