贪心算法(例题详细解说)

贪心算法 --- 例题1.活动安排问题 贪心算法 — 例题1.活动安排问题 一.问题描述 n个活动的集合E={1,2,…,n},在某一时间内要独占使用某个资源。每个活动i使用资源的起始时间为Si,终止时间为Fi。 活动i和活动j相容:是指[Si,Fi)与[Sj,Fj)不相交,即:Sj>=Fi 或Si>=Fj, 要求尽可能多地安排活动。即从活动集合E中选出最大相容活动子集。 二.解题思路 思路:最早结束的活动,优先安排。对f1,f2,…,fn从小到大排序 , 时间O(n log n); 即将n个活动按照结束时间非降序排列,依次考虑活 阅读详情

日升时奋斗,日落时自省 

目录

1、选择排序

2、分割平衡字符串 

3、买卖股票的最佳时机 II 

4、跳跃游戏

5、钱币找零

6、多机调度问题

 7、活动选择

8、无重复区间


贪心思想:顾名思义 贪 是该算法的一大特点,如何贪???

在对于问题求解时,总会做出当前看来最好的选择,也就是说不从整体最优加以考虑;他所做出的是在某种意义上的局部最优解;

那使用什么情况?

(1)贪心算法针对所有问题的整体最优可以通过一系列局部最优的选择,即贪心选择来达到,这是贪心算法可行的第一个基本要素;

(2)当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质,运用贪心策略将每一次转化都取得最优解,每一次操作都能直接对结果产生影响

基本思路:从问题的某一初始解出发一步一步地进行,根据谋个优化测度,每一步都要确保能获得局部最优解。每一步值考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起了,就不再把数据填进部分解中,直接进行枚举,或者不再添加表示算法停止

实际上,贪心算法使用的情况比较少,再使用之前选择该问题下的几个实际数据进行分析,判断即可

算法这个问题仅仅拿文字叙述太过潦草了,通过以下可以用贪心算法试题来详细理解

1、选择排序

选择排序其实就是利用贪心算法进行的,每次找到一个最小值下标,将当前序列的最小值和当前序列的开始下标进行交换;每次排序都再影响结果,以为每次排序都涉及到当前序列的最小值,整个序列从开始位置逐渐偏向有序从小到大

 代码解析(附加注释解释):

    public static  void selectSort(int[] arr){
        //外部for循环就是指当前序列 从0下标开始的当前序列 等 i++后就是 就是从1下标开始的当前序列
        for(int i=0;i<arr.length;i++){ 
            int minindex=i;
            //从当前序列开始位置后找最小值  
            for(int j=i+1;j<arr.length;j++){
                if(arr[j]<arr[minindex]){
                    minindex=j;
                }
            }
            //找到当前序列的最小值之后就进行交换 当前序列的开始位置就已经确定了
            if(minindex!=i){
                swap(arr,minindex,i);
            }
        }
    }
    private static void swap(int[] arr, int minindex, int i) {
        int tmp=arr[minindex];
        arr[minindex]=arr[i];
        arr[i]=tmp;
    }

2、分割平衡字符串 

题目详细了解来源力扣 :  力扣  

其实题目大体解释就是:在一个平衡字符串中: L 和 R 字符数量上是相同的,将该字符串尽可能多的分割成平衡字符串

例如: 把 LRLLLRRR 分割下来就是 LR 和 LLLRRR 这两个  既有L也有R的字符串

注:最终问的最多能分成几个平衡字符串

思路: 
(1)既然说的是平衡 那就定义一个 量表示平衡 balance 表示
(2)balance什么时候最平衡 0 的时候最平衡 
(3)如果遇到了L balance ++  ,如果遇到了R balance --  一个加一个减如果平衡不就是0
(4)最后balance 处理完了, 进行判断balance当前是不是为0 也就是表示是不是一个平衡字符串

 代码解析(附加注释解释):

    public  int balancedStringSplit(String s){
        int count=0;   //用来计数的
        int balance=0;  //记录平衡
        for(int i=0;i<s.length();i++){
            //处理平衡字符串  
            if(s.charAt(i)=='L'){
                balance++;
            }else if(s.charAt(i)=='R'){
                balance--;
            }
            //平衡处理结束后 进行判定是否平衡
            //每经过一次判定一次 也就没有回退操作,贪心算法步步都响应一系列局部最优
            if(balance==0){
                //计数   当前这段平衡字符串 是平衡的 计数加一
                count++;
            }
        }
        return count;
    }

3、买卖股票的最佳时机 II 

题目详细了解来源力扣 : 力扣

 给定一个数组 ,它的第i 个元素 是一支给定股票 第i天的价格

设计一个算法来计算你所能获得的最大利润,你可以尽可能地完成更多的交易(可以多次买卖一支股票)

注:手里只能有一支股票 ,也就是你买了一支股票就需要先卖掉,才能,买下一支股票

 代码解析(附加注释):

    public static  int maxProfit(int[] prices){
        int result=0;  //用来记录当前利润收入
        //  当前手上有一支股票 所以 i从 1下标开始
        for(int i=1 ;i<prices.length;i++){
            //计算今天和明天股票的利润
            int curProfit=prices[i]-prices[i-1];
            //如果股票的利润是正数那就记录下来 贪心算法 每次买卖股票最优就是有利润
            if(curProfit>0){
                result+=curProfit;
            }
        }
        return result;
    }

4、跳跃游戏

题目详细了解来源力扣 :力扣

(1)给定一个非负整数数组,你最初位于数组的第一个位置

(2)数组中的每个元素代表你在该位置可以跳跃的最大长度

(3)判断你是否能够到达最后一个位置

 代码解析(附加注释解释):

    public boolean canJump(int[] nums){
        int n=nums.length;  //计算数组元素个数   用于判定跳跃是否能跳到
        int rightmost=0;    //此处是记录 跳跃最大能跳到右侧的哪里
        for(int i=0;i<nums.length;i++){
            //当前锁在最大值不能小于当前下标了, 否则说明最大值只能跳跃到当前下标或者跳跃不到当前位置
            if(i<=rightmost){
                //贪心判定 每次都是 只保留最大跳跃的位置
                rightmost=Math.max(rightmost,i+nums[i]);
                //直到第一个最大跳跃位置能当前数组最后的位置
                if(rightmost<=n-1){
                    return true;
                }
            }
        }
        return false;
    }

5、钱币找零

假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?
例如:将96转化为零钱 

贪心思想:

(1)从最大的币值开始 也就是 100币值 大于当前值 向后缩减

(2)进行下一个币值的比较如果小于当前值,将当前值最大处理(图片解释)

(3)最终判定96是否能全部被置换,如果不能返回NO 如果能返回最少几张钱币

代码解析(附加注释): 

    public static void main(String[] args) {
        //设置 以下面值以及对应的数量 
        int[][] moneyCount={{1,3},{2,1},{5,4},{10,3},{20,0},{50,1},{100,10}};
        //输入你要 置换的面值 
        Scanner scanner=new Scanner(System.in);
        int money;
        System.out.println("请输入要支付的钱");
        money=scanner.nextInt();
        //进行置换处理
        int result=solve(money,moneyCount);
        //判断如果返回值不是 -1 那说明能置换成功
        if(result!=-1){
            System.out.println(result);
        }else{
            System.out.println("No");
        }
    }
    private static int solve(int money, int[][] moneyCount) {
        int num=0;
        //贪心 思想
        //从面值大 钱币开始  为了能够以最少的钱币数量 置换结束
        for(int i=moneyCount.length-1;i>=0;i--){
            //求需要置换的钱 和 能中和掉多少张当前面值 取最小值
            //一个是 要满足 当前的钱 能 容纳下
            //另一个 要满足 面值数量 是否够
            int c=Math.min(money/moneyCount[i][0],moneyCount[i][1]);
            //将当前的钱 - 最大数量的面值
            money=money-c*moneyCount[i][0];
            //加上需要消耗的面值数量
            num+=c;
        }
        //如果不能找开 钱就还有剩余  所以返回-1 
        if(money>0){
            return -1 ;
        }
        //如果能找开, 返回钱币数量
        return num;
    }

6、多机调度问题

某工厂有n个独立的作业,由m台相同的机器进行加工处理,作业i所需的加工时间ti,任何作业在被处理时不能中断,也不能进行拆分处理。现厂长请你给写一个程序:算出n个作业由m台机器加工处理的最短时间

此处:贪心思维就在于处理最大任务时间,将任务时间从降序分配给时间任务最小的机器

题目解析:

(1)首先需要输入机器数 ,一台机器处理一个任务时间

(2)如果任务数大于机器数:就是将处理最短时间任务的机器,将其他任务时间给当前机器

(3)重复以上操作(以下图解)

 代码解析(附加注释):

以下代码有点长, 图解是思路解释,先通好思路,然后看以下代码,注释详细

public class MultiMachineTest {
    public static void main(String[] args) {
        int n,m;
        System.out.println("请输入作业数和机器数");
        Scanner scanner=new Scanner(System.in);
        //输入任务数量
        n=scanner.nextInt();
        //机器数量
        m=scanner.nextInt();
        //创建一个针对任务数量的数组 一会用于存放对应的任务的时间
        Integer[] works=new Integer[n];
        //以数组创建m个机器
        Integer[] machines=new Integer[m];
        //给每个任务都需要赋值一定的任务时间
        for(int i=0;i<n;i++){
            works[i]=scanner.nextInt();
        }
        //将所有机器处理
        System.out.println(greedStrateg(works,machines));
    }
    private static int greedStrateg(Integer[] works, Integer[] machines) {
        //首先 给定的时间肯定不是有序的 所以需要对当前传来数组进行排序 还是降序排序
        //贪心算法 从最大时间开始
        int minimaTime= machines.length; //记录最短时间
        int workNum=works.length; //机器数量
        Arrays.sort(works,new myComparator());
        //作业数如果小于机器数 ,直接返回最大的作业时间 其实也就是最短时间
        if(workNum<minimaTime){
            return works[0];
        }else{
            //作业数大于机器数的情况
            for(int i=0;i<works.length;i++){
                //选择最小的机器 任务时间加上
                int flag=0;
                //首先假设用第一个机器处理  ,也就是临时机器
                int tmp=machines[flag];
                //从剩余的机器中找运行时间最短的机器,进行加任下一个任务
                for(int j=1;j<machines.length;j++){
                    //找最小值 进行加任务  有点像插入排序
                    if(tmp>machines[j]){
                        flag=j;
                        //记录下来
                        tmp=machines[j]; 
                    }
                }
                //将当前作业交给最小的机器执行
                machines[flag]+=works[i];
            }
            //从所有机器中选出最后执行完成作业的机器   刚刚图解再最后找的是当前序列的最大值
            minimaTime=findMax(machines);
            return minimaTime;
        }
    }
    private static int findMax(Integer[] machines) {
        //先假设机器的 为最小值
        int ret=machines[0];
        //进行操作比对操作
        for(int cur:machines){
            //找到当前序列的最大值
            if(ret<cur){
                ret=cur;
            }
        }
        //返回最大值  也是所有机器运行的最短时间
        return ret;
    }
}
class myComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer a, Integer b) {
        return b-a;
    }
    //按作业时间从大到小排序
}

 7、活动选择

有n个需要在同一天使用同一个教室的活动a1, a2, …, an,教室同一时刻只能由一个活动使用。每个活动a[i]都有一个开始时间s[i]和结束时间f[i]。一旦被选择后,活动a[i]就占据半开时间([s[i],f[i])。如果([s[i],f[i])和([s[j],f[j])互不重叠,a[i]和a[j]两个活动就可以被安排在这一天。求使得尽量多的活动能不冲突的举行的最大数量

 代码解析(附加注释):

public class ActivitySelection {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int number=scanner.nextInt();
        //活动 使用二维数组表示 行表示序号 列就表示0标 代表 开始时间和1标 代表 结束时间
        int[][] act=new int[number][2];
        int idx=0;
        for(int i=0;i<act.length;i++){
            act[i][0]=scanner.nextInt(); //表示开始时间
            act[i][1]= scanner.nextInt(); //表示结束时间
        }
        //以结束时间排序  贪心就在于找结束时间 主要就是找
        Arrays.sort(act,new MyComparator());
        //这就是 活动选择
        int ret=greedyActivitySelector(act);
        System.out.println(ret);
    }
    public static  int greedyActivitySelector(int[][] act){
        //num表示活动个数 本身就是1个 所以num=1 i表示当前活动
        int num=1,i=0;
        //j=1表示下一个活动
        for(int j=1;j<act.length;j++){
            //表示下一个活动开始时间 大于 当前活动结束时间
            if(act[j][0]>=act[i][1]){
                //进行比对成功后 下一个活动也成了当前活动
                i=j;
                //每能进行一次比对 活动个数加一
                num++;
            }
        }
        return num;
    }
}
class  MyComparator implements Comparator<int[]>{
    //以  活动结束时间   进行排序
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[1]-o2[1];
    }
}

8、无重复区间

题目详细了解来源力扣 :力扣

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠

注意:可以认为区间的终点总是大于它的起点,区间[1,2]和[2,3]的边界相互“接触”,但没有相互重叠

 代码解释(附加注释):

    class MyComparatorNow implements Comparator<int[]>{
        @Override
        public int compare(int[] o1, int[] o2) {
            //用来计算  前者排序
            return o1[0]-o2[0];
        }
    }
    public int eraseOverlapIntervals(int[][] intervals){
        if(intervals.length==0){
            return 0;
        }
        //此处进行排序 排序的是区间的开始位置  为以下的操作做准备
        Arrays.sort(intervals,new MyComparatorNow());
        int end=intervals[0][0];  //把当前位置作为准备的区间
        int prev=0;               //前一个区间
        int count=0;              //用来计数 要移除的区间
        for(int i=1;i<intervals.length;i++){
            //对比的是     前一个区间的末尾位置 大于 后一个区间的初识位置
            //第二种情况
            if(intervals[prev][1]>intervals[i][0]){
                //当前范围内是大于后一个区间的初识位置,还要判断是否大于后一个区间的末尾位置
                //前一个区间包含了后一个区间,那就说明了出现重复区间了
                //第三种情况
                if(intervals[prev][1]>intervals[i][1]){
                    //此处是包含后一个区间了 为了减少前一个大区间的影响,前一个大区间会被移除,留下后一个小区间
                    prev=i;
                }
                //当前无论是前一个区间还是后一个区间
                //因为第二种情况 包含了 第三种情况 都是要进行移除数量+1
                count++;
            }else{//第一种情况
                //如果 前一个区间的末尾值 小于 后一个区间的初始值
                //那就将下一个区间作为对比区间  当前不是重叠区间
                prev=i;
            }
        }
        //返回区间个数
        return count;
    }

 总结:贪心算法针对最多最少类问题,可以进行一系列局部最优后完成整体最优,如果实际上问题,个例问题过多不就成了全部枚举,贪心算法是尽可能一系列局部最优,个别枚举。

【算法】—贪心算法详解 !翻硬币快乐司机旅行家的预算买卖股票的最好时机I买卖股票的最好时机IIPrim算法_优快云博客_prim算法dijstra求最短路径最小花费。 阅读详情

相关推荐

贪心算法(附蓝桥杯例题)

贪心算法(Greedy Algorithm)是一种‌通过局部最优选择逐步推导全局最优解‌的算法思想‌4。‌无后效性‌:当前决策不影响后续状态‌最优子结构‌:局部最优解能推导全局最优解适用于贪心算法的问题往往具有明确的‌排序性质‌和‌可分解性‌,如合并问题、区间调度等‌45。

m0_74655006的博客 1483

贪心算法例题

贪心算法经典例题解析 贪心法:遵循某种规律,不断贪心的选取当前最优策略的算法设计方法。 例一:分糖果 已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s >= 某个孩子的需求因子g时,代表该糖果可以满足该孩子;求使用这些糖果,最多能满足多少孩子?(注意,某个孩子最多只能用1个糖果满足)例如,需求因子数组g = [5, 10, 2, 9, 15, 9];糖果大小数组s = [6, 1, 20, 3, 8];最多可以满足3个孩子 思考:   1、当某个孩子可以被多个糖果

xiaobaidad的博客 3669

贪心算法三个经典例题

贪心算法的三个经典例题 A- Saruman’s Army 题目描述:Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep track of his forces, Saruman distributes seeing stones, known as pal...

贪心算法 6418

算法提高:贪心策略的11个经典题目

算法成神之路:11个经典贪心算法

阿呆的隐秘角落 8548

贪心算法,C/C++代码,典型例题分析(超详细)

超级详细的贪心算法详解,请耐心看完一遍,绝对能懂! 我先谈谈我对贪心算法的认识吧: 我觉得贪心算法说简单一点,其实就是一个对单位量大小的排序,举个很简单的例子,就比如说你现在背了一个兜要去超市买东西,你要以拥有的钱买商品填满你的兜,你是不是要考虑你单位的钱(这里的单位的钱可以理解成一块钱)可以买到的商品的体积的大小,单位的钱买到商品的体积越大越好,当然一般此类问题的时候,都有很多类商品供你选择,并且商品是有限的,也就是说你不可能把所有的钱全部拿去买一种商品。所以我们遇到此类问题的时候,就可以先对单位钱可以买

m0_55233347的博客 4124

贪心算法经典例题.doc

贪心算法经典例题.doc贪心算法经典例题.doc贪心算法经典例题.doc贪心算法经典例题.doc贪心算法经典例题.doc贪心算法经典例题.doc贪心算法经典例题.doc

详解贪心算法(Python实现贪心算法典型例题)

贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 贪心算法的要素 贪心选择 贪心选择是指所求问题的整体最优解可以通过...

一个平平无奇的甜妹 4万+

手把手教你用6轴IMU跑通LIO-SAM:参数配置与代码修改保姆级教程

本文提供了一套完整的6轴IMU适配LIO-SAM的解决方案,包括参数配置与代码修改的详细步骤。从理解6轴与9轴IMU的关键差异入手,逐步指导如何调整核心配置文件params.yaml、重构utility.h关键函数、优化mapOptimization.cpp的位姿融合逻辑,并给出编译验证与性能调优建议,帮助开发者快速实现6轴IMU在LIO-SAM中的稳定运行。

weixin_28717807的博客 356

贪心算法详细讲解(附例题,一看就会)

概念 贪心算法(Greedy Alogorithm)又叫登山算法,它的根本思想是逐步到达山顶,即逐步获得最优解,是解决最优化问题时的一种简单但是适用范围有限的策略。 贪心算法没有固定的框架,算法设计的关键是贪婪策略的选择。贪心策略要无后向性,也就是说某状态以后的过程不会影响以前的状态,至于当前状态有关。 贪心算法是对某些求解最优解问题的最简单、最迅速的技术。某些问题的最优解可以通过一系列的最优的选择即贪心选择来达到。但局部最优并不总能获得整体最优解,但通常能获得近似最优解。 在每一部贪心选择中,只考虑当前对

qq_44398094的博客 2万+

ArcGIS License Server点击启动没反应,许可管理器无法启动怎么办

4 当我们再打开ArcGIS License Server Administrator的时候。3 在【服务】中找到【ArcGIS License Manager】双击。无法启动ArcGIS License Server的情况。在使用ArcGIS的过程中,我们经常会遇到。专注GIS领域知识分享,交流行业软件技巧。欢迎关注,不定期分享GIS各种问题和技巧。1 右击我的电脑——【管理】服务状态——启动,确定即可。启动类型选择——自动。

GIS蒲公英的博客 2万+

Python入门之机器学习(非常详细)篇幅拉满,一般人看不完!

什么是机器学习?监督学习 supervised learning;非监督学习 unsupervised learning;半监督学习 semi-supervised learning;强化学习 reinforcement learning;监督学习是不断向计算机提供数据(特征),并告诉计算机对应的值(标签),最后通过大量的数据,让计算机自己学会判断和识别。例如Google Photo,你在APP中输入狗,这时就会弹出与狗相关的图片,这背后使用的算法就是监督学习。

xiaolinyui的博客 2万+

贪心算法的几种经典例题

什么是贪心算法 贪心算法是一种在解决问题的过程中追求局部最优的算法,对于一个有多种属性的事物来说,贪心算法会优先满足某种条件,追求局部最优的同时希望达到整体最优的效果。以背包问题为例,可以放在背包中的物体有它的重量和价值两种属性,背包的容量也是有限的,我们希望得到一种价值最大的物品摆放方式,如果我们倾向于重量贪心,那么在摆放物品的时候会优先放重量小的,但这和我们追求的价值最优没有关系,自然不能采用...

马一凡的博客 5万+

地瓜机器人RDK Studio使用入门教程

不知道大家在使用AI开发板的时候有没有遇到过板子官方镜像占据空间大难以保存,想要的时候找不到?官方示例项目久而久之便难以找寻?首次登陆开发板连接网络还需要准备显示器键盘鼠标外设繁杂?…为了解决平时开发过程中遇到的种种不便利问题,地瓜机器人创新的推出了RDK Studio这一官方开发者软件,使智能机器人开发迎来新纪元!通过这一软件极大降低了机器人的开发门槛,哪怕是零基础的用户亦可轻松上手RDK系列板卡!

xiongqi123123的博客 3424

贪心算法典型例题

贪心是算法中一种特别基础和重要的思想,下面从几个例题中开始讲解贪心的思想。 1. 分糖果(leetcode455) 题目:已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s&amp;amp;amp;gt;=某个孩子的需求因子g时,代表该糖果可以满足该孩子,求使用这些糖果,最多能满足多少孩子(注意,某个孩子最多只能用1个糖果满足) 思考: 当某个孩子可以被多个糖果满足时,是否需要...

bajin7353的博客 3万+

游戏大厂技术护城河:你以为他们靠“美术和买量”,其实背后全是硬家伙

先把效果堆满到快上线了才发现低端机跑不动然后疯狂砍特效、降分辨率,画面崩、口碑崩机型分档(低/中/高)每帧预算(CPU/GPU 各多少 ms)每种资源预算(贴图、网格、粒子数量)性能自动回归(每天跑性能测试,发现波动立刻报警)大白话:小厂像装修到入住前才发现电路不够,临时拉线;大厂从设计图开始就算承重、算电路、算水压。玩家会不会来?活动会不会爆?版本会不会翻车?外挂会不会泛滥?竞品会不会抄?流量不确定 → 可扩容架构版本不确定 → 灰度与回滚。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 104

基于FISCO BCOS 部署可升级的 Solidity存证智能合约

本文介绍了基于FISCOBCOS平台的可升级Solidity存证智能合约实现方案。采用透明代理模式,包含逻辑合约、代理合约和管理合约三部分,支持业务逻辑升级而不影响存储数据。详细阐述了合约架构设计、Solidity代码实现、Go SDK交互流程以及完整的部署升级步骤。方案具有数据持久性、版本兼容性和生产就绪等特点,提供了权限控制、输入验证等安全机制,并包含监控管理工具。该实现为企业级区块链存证应用提供了可靠的基础架构,支持后续功能扩展和定制化开发。

分享AI、区块链技术及应用,未来已来 1512

贪心算法——思路与例题

那么如何实现呢,具体就是对于第一个国家,那么这个值就是a-b-c,对于第二个国家,这个值就是b-a-c,对于第三个国家,这个值就是c-a-b,可以看出,其实就是相对值,也就是这个事件发生时,对第一个国家,第二个国家,第三个国家的胜利的贡献值。那么我们应该倒序考虑,这样我们可以选择的巧克力种类才最多,因为在第x天时,我们选择的巧克力的保质期一定是大于等于x的,这就意味着,当在1—x天里的任意一天时,可以选择的巧克力种类最多。题目分析:现在一共有n种巧克力,每种巧克力包含三个信息:价格,保质期,数量。

2301_79862041的博客 2299

2026年软考高级网络规划设计师第三版备考笔记

删除了所有已退出主流应用、行业淘汰的技术内容,如 HDLC、xDSL、WiMAX、HSRP/GLBP 等,让教材内容更聚焦当下一线网络工程实际场景,剔除无效考点。

鹿鸣天涯 1211

【数据结构与算法】贪心算法及例题

数据结构与算法:贪心算法例题

ChenZHIHAO_y的博客 1355

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

详解贪心算法

贪心算法是一种在求解最优化问题时采取的一种常用算法策略。贪心算法的基本思想是,每次选择当前情况下的局部最优解,并相信这个局部最优解能够导致全局最优解。

闻道有先后,术业有专攻 4747

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[算法系列]贪心算法策略介绍+10道经典例题解析

本部分介绍“贪心算法“ 。 接下来会介绍动态规划。回顾一下之前脉络: 什么是递归?如何设计递归算法? || \/ 常见的递归算法应用(快排、归并、堆、) || \/ 深入递归本质:数学归纳,递推 || \/ 深度遍历优先搜索(DFS)、回溯、剪枝 || \/ 贪心算法、动态规划 那么贪心、动规与前面这些有什么联系呢?为什么要放在这里介绍? 首先,贪心、动规和dfs这样的搜素算法实际很相似,是为了搜索解空间获得(满足条件)的解。DFS是按照一定的(深度优

lawfree的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

算法学习笔记:23.贪心算法之活动选择问题 ——从原理到实战,涵盖 LeetCode 与考研 408 例题

《贪心算法解活动选择问题全攻略》摘要:活动选择问题是贪心算法的经典应用,要求在有限资源下选择最多互不冲突的活动。本文详细解析了贪心策略的核心思路(选择结束最早活动)、算法步骤及正确性证明,并通过LeetCode例题(435无重叠区间、646最长数对链)和考研408真题进行实战演示。文章还探讨了资源约束下的扩展解法,分析了时间复杂度(O(nlogn)),并提供了Java实现代码。最后总结了该算法在会议安排、任务调度等场景的应用价值,强调掌握贪心选择性质和最优子结构的重要性。

CSBIGDOG的博客 1760

JAVA贪心算法例题

韩顺平老师讲解---个人总结 JAVA贪心算法:寻找第一个满足条件的结果,最后的结果不一定为最优,但是每一步的结果一定是最优 例题:有5个电台,每个单台有自己的覆盖区域,求可以覆盖所有区域的最少数量电台集合 解析:用贪心算法:每次取一个电台,所取电台一定是剩下电台中,覆盖“未被覆盖区域”最多的电台 即:最后的结果不一定是最优的,但是每一步的结果一定是最优的 import java.util.ArrayList; import java.util.HashMap; import jav..

FamilyLin 347

贪心算法例题【Java解法】

贪心算法例题【Java解法】一、基本概念二、贪心算法的基本思路三、贪心算法适用的问题四、例题分析 一、基本概念 贪心算法(greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。 个人理解:贪心算法从名字上看重点是贪心这个词,贪心即欲望大,不知满足。在算法中贪心体现在将问题划分成多个子问题后,对每个子问题都要求当前子问题的最优解。同时贪心这个词也能很好地体现该算法的适用范围,贪心策略必须具备无后效性,

qq_45294437的博客 1323
上一篇: 十大常见排序算法(java编写)
下一篇: 动态规划(详细解释)
学习自省
博客等级 码龄5年 284粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值