贪心算法
本程序主要实现为从一堆的含有各个城市(可能相同)中,如下五组
北京、上海、天津 广州、北京、深圳 成都、上海、杭州 上海、天津 杭州、大连
选取其中的几组,使得它们组成的数组中含有全部的城市
北京、上海、天津、广州、深圳、成都、杭州、大连
package datastructure.greedyalgorithm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
public class GreedyAlgorithm {
public static void main(String[] args) {
HashMap<String, HashSet<String>> cities = new HashMap<>();
HashSet<String> city1 = new HashSet<>();
city1.add("北京");
city1.add("上海");
city1.add("天津");
HashSet<String> city2 = new HashSet<>();
city2.add("广州");
city2.add("北京");
city2.add("深圳");
HashSet<String> city3 = new HashSet<>();
city3.add("成都");
city3.add("上海");
city3.add("杭州");
HashSet<String> city4 = new HashSet<>();
city4.add("上海");
city4.add("天津");
HashSet<String> city5 = new HashSet<>();
city5.add("杭州");
city5.add("大连");
cities.put("K1",city1);
cities.put("K2",city2);
cities.put("K3",city3);
cities.put("K4",city4);
cities.put("K5",city5);
HashSet<String> allCities = new HashSet<>();
allCities.add("北京");
allCities.add("上海");
allCities.add("天津");
allCities.add("广州");
allCities.add("深圳");
allCities.add("成都");
allCities.add("杭州");
allCities.add("大连");
HashSet<String> tmpCity = new HashSet<>();
List<String> total = new ArrayList<>();
String tmpKey = null;
while (allCities.size() != 0) {
tmpKey = null;
for (String key : cities.keySet()) {
tmpCity.clear();
HashSet<String> selectCity = cities.get(key);
tmpCity.addAll(selectCity);
tmpCity.retainAll(allCities);
if (tmpCity.size() > 0 &&
(tmpKey == null || tmpCity.size() > getTogether(tmpKey,cities,allCities).size())){
tmpKey = key;
}
}
if (tmpKey != null) {
total.add(tmpKey);
allCities.removeAll(cities.get(tmpKey));
}
}
System.out.println(total);
}
public static HashSet<String> getTogether(String key, HashMap<String,HashSet<String>> h1, HashSet<String> h2) {
HashSet<String> set = h1.get(key);
set.retainAll(h2);
return set;
}
}