算法详解:这一篇带你入门贪心算法!!

1、🍉贪心算法核心思想

       在每一步的选择中都采取最好或者最优的结构,期望得到最优的结果,虽然每一步都选择最优的结果,其结果并不一定为最优,但一定是最为接近最优结果的。

2、举个🌰例子

       假设有三种面值的钞票,分别为1块、3块和5块,现在,笔笔买🍍需要付11块,那么笔笔应该怎样用最少的钞票付款呢?

       在日常生活中,笔笔一般喜欢先用大面值的、再用小面值的,因为这样效率是最高的,所以,笔笔会选择用2张5元的钞票和1张1元的钞票付款,如此,一共需要3张钞票,而3张钞票就是最少的组合钞票数,故而3张钞票就是最优的结果。

3、写个✎题吧!

3.1、👀看看题目~~

       现在有北京、上海、天津、深圳、广州、成都、杭州、大连共8个城市需要覆盖广播信号,针对该工程,供应商推出5种信号塔,K1{北京、上海、天津},K2{广州、北京、深圳}、K3{成都、上海、杭州}、K4{上海、天津}、K5{杭州、大连}。为了控制成本,要求尽可能的用最少的信号塔覆盖全部城市,请你找出可行的方案!(题目是自拟的,因为记不住了,不过意思差不多啦,将就一下下吧Ծ‸Ծ)

3.2、题目分析🔬~

       根据题意分析,我们需要从5个信号塔中找出并集为{北京、上海、天津、深圳、广州、成都、杭州、大连}的最少的组合。很明显,对于这种组合找最优结果的问题,我们可以使用贪心算法进行解题。

3.3、解题思路🧠分享 (@all 仅供参考!)

       我们可以利用穷举,将每一个信号塔与需要覆盖的城市进行比较,每次保存一个能覆盖最多城市的信号塔,然后将该信号塔所覆盖的城市移除,继续进行下一个最优信号塔的查找,直到所有的城市都被覆盖。

3.4、来写代码吧⌨

public static void broadc(){
        //存放所有地区
        HashSet<String> citys = new HashSet<String>();
        citys.add("北京");
        citys.add("天津");
        citys.add("上海");
        citys.add("广州");
        citys.add("深圳");
        citys.add("成都");
        citys.add("杭州");
        citys.add("大连");

        //创建电台
        HashSet<String> k1 = new HashSet<String>();
        k1.add("北京");
        k1.add("上海");
        k1.add("天津");
        HashSet<String> k2 = new HashSet<String>();
        k2.add("广州");
        k2.add("北京");
        k2.add("深圳");
        HashSet<String> k3 = new HashSet<String>();
        k3.add("成都");
        k3.add("上海");
        k3.add("杭州");
        HashSet<String> k4 = new HashSet<String>();
        k4.add("上海");
        k4.add("天津");
        HashSet<String> k5 = new HashSet<String>();
        k5.add("杭州");
        k5.add("大连");

        //创建广播站,将各个电台放入
        HashMap<String,HashSet> map = new HashMap<>();
        map.put("k1",k1);
        map.put("k2",k2);
        map.put("k3",k3);
        map.put("k4",k4);
        map.put("k5",k5);

        //临时存放电台的覆盖范围
        HashSet<String> temp = new HashSet<String>();

        //选择的电台
        //选择的电台
        ArrayList<String> list = new ArrayList();
        //当前覆盖范围最广的电台
        String maxKey = null;
        
        //城市不为空就一直循环
        while(citys.size()!=0){
            //每次选择最优结构的时候都需要将上一次的选择清空
            maxKey = null;
            //遍历广播电台
            for(String keySet:map.keySet()){
                //清空上一次的选择
                temp.clear();
                //获取当前的电台
                HashSet hashSet = map.get(keySet);
                //将当前电台存入临时变量
                temp.addAll(hashSet);
                //和全部范围取交集并将交集赋值给临时电台
                temp.retainAll(citys);
                //temp.size()>0表示交集大于1,说明还没有全部覆盖
                //maxKey == null说明还未指向某一电台
                //temp.size() > map.get(maxKey).size()说明当前电台比之前的电台覆盖范围更广
                if(temp.size()>0 && (maxKey == null || temp.size() > map.get(maxKey).size())){
                    maxKey = keySet;
                }
            }
            //将当前覆盖最广的电台存入集合中
            list.add(maxKey);
            //移除已被覆盖的城市
            citys.removeAll(map.get(maxKey));
        }
        System.out.println(list);
    }

运行如下:
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值