贪心算法【区间调度】【背包问题】【集合覆盖】【旅行商问题】【哈夫曼构造价值树】

贪心算法

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

1.区间调度问题

假设有如下课程,希望尽可能多的将课程安排在一间教室里:

课程 开始时间 结束时间
美术 9AM 10AM
英语 9:30AM 10:30AM
数学 10AM 11AM
计算机 10:30AM 11:30AM
音乐 11AM 12AM

算法设计:

  • 1.选择结束最早的课,便是要在这教室上课的第一节课
  • 2.接下来,选择第一堂课结束后才开始的课,并且结束最早的课,这将是第二节在教室上的课。

代码:

import java.util.*;
public class Main{
   
   
    public static void main(String[] args) {
   
   
        String subject[] = {
   
   "英语","数学","计算机","音乐","美术"};
        Work[]  works = {
   
   
                new Work(1,3),
                new Work(2, 5),
                new Work(4, 7),
                new Work(6, 9),
                new Work(8, 10)
        };
        int result = solution(works);
        System.out.println(result);
    }
    private static int solution(Work[] works) {
   
   
        //works里面已经按end从小到大排序了
        Arrays.sort(works);
        int count = 0;
        //当前工作的结束时间
        int endTime = 0;
        for(int i = 0;i<works.length;i++){
   
   
            if(endTime<works[i].getStart()){
   
   
                count++;
                endTime = works[i].getEnd();
            }
        }
        return count;
    }
    static class Work implements Comparable{
   
   
        private int start;
        private int end;
        public Work(int start, int end) {
   
   
            this.start = start;
            this.end = end;
        }
        //end 从小到大排序
        @Override
        public int compareTo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值