貪心算法,記得學的時候仍是大學的時候,再次來總結一下吧。算法
貪心算法並非指具體的固定代碼,而是指一種思路,加入咱們每次都選最好的選擇,那麼很大可能會獲得最好的結果。code
題目:blog
思路,加入把k1到k5輪詢一遍,發現k一、k二、k3能夠覆蓋範圍最多,隨便取一個,假設取k1。string
那麼剩下廣播地區就餘下除了k1的須要覆蓋。it
那麼如今廣播k1沒了,就剩下k2到k5廣播。io
繼續前面的操做,看下此次誰能覆蓋剩下的多,而後就取那一個。ast
知道全部地區被覆蓋爲止。class
代碼實現:foreach
static void Main(string[] args) { //初始化電臺 Dictionary<string, HashSet<string>> broadcasts = new Dictionary<string, HashSet<string>>(); 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("大連"); broadcasts.Add("k1",k1); broadcasts.Add("k2", k2); broadcasts.Add("k3", k3); broadcasts.Add("k4", k4); broadcasts.Add("k5", k5); //初始化要覆蓋的地區 HashSet<String> allAreas = new HashSet<String>(); allAreas.Add("北京"); allAreas.Add("上海"); allAreas.Add("天津"); allAreas.Add("廣州"); allAreas.Add("深圳"); allAreas.Add("成都"); allAreas.Add("杭州"); allAreas.Add("大連"); //建立ArrayList, 存放選擇的電臺集合 List<String> selects = new List<String>(); HashSet<String> tempSet = new HashSet<String>(); string maxKey = string.Empty; while (allAreas.Count != 0) { maxKey = string.Empty; int maxNum = 0; foreach (String key in broadcasts.Keys) { tempSet.Clear(); tempSet.UnionWith(allAreas); tempSet.IntersectWith(broadcasts[key]); if (tempSet.Count>0&&(maxKey==string.Empty||tempSet.Count> maxNum)) { maxKey = key; maxNum = tempSet.Count; } } //選好後移除 if (maxKey != string.Empty) { selects.Add(maxKey); allAreas.ExceptWith(broadcasts[maxKey]); } } foreach (var data in selects) { Console.WriteLine(data); } Console.Read(); }
結果:List
貪心算法不必定是最優解,可是這種解法比較快,否則要把全部的狀況考慮進去。