從新整理數據結構與算法(c#)——算法套路貪心算法[二十八]

前言

貪心算法,記得學的時候仍是大學的時候,再次來總結一下吧。算法

貪心算法並非指具體的固定代碼,而是指一種思路,加入咱們每次都選最好的選擇,那麼很大可能會獲得最好的結果。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

貪心算法不必定是最優解,可是這種解法比較快,否則要把全部的狀況考慮進去。

相關文章
相關標籤/搜索