活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
…
1.算法概述
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
2.算法流程
- 从问题的某个初始解出发。
- 采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略,得到一个部分解,缩小问题的范围或规模。
- 将所有部分解综合起来,得到问题的最终解。
3.算法应用
哈夫曼树
最小生成树算法:Prim、Kruskal
最短路径算法:Dijkstra
4.算法联系
最优装载问题,加勒比海盗
问题如下:
◼ 在北美洲东南部,有一片神秘的海域,是海盗最活跃的加勒比海
有一天,海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一旦打碎就失去了它的价值
海盗船的载重量为 W,每件古董的重量为 𝑤i,海盗们该如何把尽可能多数量的古董装上海盗船?
比如 W 为 30,𝑤i 分别为 3、5、4、10、7、14、2、11
思路如下:
◼ 贪心策略:每一次都优先选择重量最小的古董
① 选择重量为 2 的古董,剩重量 28
② 选择重量为 3 的古董,剩重量 25
③ 选择重量为 4 的古董,剩重量 21
④ 选择重量为 5 的古董,剩重量 16
⑤ 选择重量为 7 的古董,剩重量 9
最多能装载 5 个古董
实现如下:
/**
* 最优装载问题,箱子容量为100,物品重量分别为23,6,4,64,7,31,5,37,5,9,22,32, 15,问最多装几件
*/
public class OptimalLoad {
public static void main(String[] args) {
int[] weights = new int[] {23,6,4,64,7,31,5,37,5,9,22,32, 15};
int i = optimalLoad(100, weights);
System.out.println("最多存放" + i + "件物品");
}
public static int optimalLoad(int capacity, int[] weights) {
int count = 0;
Arrays.sort(weights);
for (int weight : weights) {
int newCapacity = capacity - weight;
if (newCapacity >= 0) {
count++;
capacity = newCapacity;
} else {
break;
}
}
return count;
}
}
```java