**贪婪算法:**每步都采取最优的做法,局部最优解最终也是全局最优解.
我们用集合表示要覆盖的州.集合类似于列表,只是同样的元素只能出现一次,即集合不能包含重复的元素.
1.并集意味着将集合合并
2.交集意味着找出两个集合中都有的元素
3.差集意味着将从一个集合中剔除出现在另一个集合中的元素
# 所有广播要覆盖的州
states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])
stations = {}
# 每个广播电台要覆盖的州
stations["kone"] = set(["id", "nv", "ut"])
stations["ktwo"] = set(["wa", "id", "mt"])
stations["kthree"] = set(["or", "nv", "ca"])
stations["kfour"] = set(["nv", "ut"])
stations["kfive"] = set(["ca", "az"])
final_stations = set()
while states_needed: # 所有广播要覆盖的州,并逐次减少.
best_station = None
states_covered = set()
for station, stations_for_station in stations.items(): # 循环获取每个广播电台要覆盖的州
covered = states_needed & stations_for_station # 交集运算,获取最大的一个广播电台要覆盖的州
if len(covered) > len(states_covered): # 如果当前广播电台覆盖的州最多
best_station = station # 保存电台名
states_covered = covered # 保存电台覆盖的州
states_needed -= states_covered # 在所有要覆盖的电台中减去最大的电台所覆盖的州
final_stations.add(best_station) # 将当前广播电台覆盖的州最的广播电台名添加到final_stations集合中
print(final_stations)
求得要覆盖所有的州需要那些广播电台