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);
}
运行如下: