常见算法-贪心算法


活动地址: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值