Knapsack problem, radio station problem and activity scheduling problem in greedy algorithm

knapsack problem

goods = [(60, 10), (100, 20), (120, 30)]
# 我们需要对商品首先进行排序,
# 当然这里是排好序的
goods.sort(key=lambda x: x[0]/x[1],reverse=True)
# w 表示背包的容量
def fractional_backpack(goods, w):
    # m 表示每个商品拿走多少个
    #enumerate可以同时获得key值和value值
    total_v = 0
    m = [0 for _ in range(len(goods))]
    for i, (prize, weight) in enumerate(goods):
        if w >= weight:
            m[i] = 1
            total_v += prize
            w -= weight
    # m[i] = 1 if w>= weight else weight / w
        else:
            m[i] = w / weight
            total_v += m[i] * prize
            w = 0
        break
    return m, total_v

res1, res2 = fractional_backpack(goods, 50)
print(res1, res2) # [1, 1, 0.6666666666666666]

radio problem

# 需要覆盖广播台的州
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: ##states_=needed当中还存在有州没有完成覆盖
	#遍历所有的广播台,从中选择覆盖了最多的未覆盖州的广播台,存储在best_station中
	best_station = None
	#储存该广播台覆盖的所有未覆盖的州
	states_covered = set()
	for station, states_for_station in stations.items():
		#同时出现在states_needed和states_for_station中的州:当前广播台覆盖的一系列还未覆盖的州
		covered = states_needed & states_for_station
		if len(covered) > len(states_covered):
            
			best_station = station
			states_covered = covered

	states_needed -= states_covered
	final_stations.add(best_station)

print(final_stations)


while states_needed:
    best_station=None
    states_covered=set()
    for station,states_of_station in stations.items():
        coverd=states_needed&states_for_station
        if len(covered)>len(states_covered):
            best_station=station
            states_covered=covered
    states_needed-=states_covered
    final_stations.add(best_station)


Event scheduling issues


# 一个元组表示一个活动,(开始时间,结束时间)
activities = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 9), (5, 9), (6, 10), (8, 11),
(8, 12), (2, 14), (12, 16)]
# 保证活动是按照结束时间排好序,我们可以自己先排序
activities.sort(key=lambda x: x[1])
def activity_selection(a):
    # 首先a[0] 肯定是最早结束的
    res = [a[0]]
    for i in range(1, len(a)):
        if a[i][0] >= res[-1][1]: # 当前活动的开始时间小于等于最后一个入选活动的结束时间不冲突
            res.append(a[i])
    return res
res = activity_selection(activities)
print(res)

Guess you like

Origin blog.csdn.net/jcandzero/article/details/126919369