[英]How to Determine Cheapest Commute Ticket Combination
我當地的火車服務最近添加了一個透析通勤選項。 我正在嘗試確定在給定日期找到給定一組往返旅行的最便宜的票組合的算法。
這是英文問題。 給定一天和每天的騎行,以下哪種組合最便宜。
由於我很樂意將此限制為一次僅解決一年,我認為日期列表可以很容易地存儲在看起來像這樣的數組中。
{0,0,1,1,1,0,0,2,1,0,0,0,4,0,1,1,...,0,1,1,5}
數量等於每天往返次數。
我可以使用什么算法來確定涵蓋所有行程的最便宜的機票組合?
你可以通過解決子問題來做到這一點:
What is the cheapest combination C[k] to cover all trips from day 0 up to day k?
要計算此子問題的答案,您可以簡單地考慮購買故障單類型的每種情況。 通過解決從0開始並一直工作到365的問題,您可以在解決子問題時使用以前的結果。
例如,假設在第100天您不需要旅行。 那么答案將是C [99],這是前幾天旅行中最便宜的方式。
但是,假設在第101天你需要進行3次旅行。 那么C [101]的答案將是最便宜的:
Buy round trip tickets today: cost 3*w+C[100]
Buy a 7 day ticket 7 days ago: cost x+C[101-7]
Buy a 30 day ticket 30 days ago: cost y+C[101-30]
計算出C [365]后,您可以將其與全年票證的成本z進行比較。
(如果在此過程中您發現自己要求成本C [i] i小於0,則C [i]的值為0.)
這是我在python中的解決方案。 但首先,讓我給出一些背景信息,以便下面的代碼有意義。
問題陳述:
您想購買即將到來的月份的公共交通票。 你知道你將要旅行的日子。 這個月有30天,有3種類型的門票:
例,
month_travel_days = [1,2,4,5,7,29,30]
從示例旅行天數來看,最低成本為P11,購買7天票價為P7,然后分別購買29日和30日剩余的兩天票價P4。
解決在任何旅行天數列表中最小化購票成本的問題。
from operator import itemgetter
#travel_dates = [1,2,4,5,7,29,30]
travel_dates = [1,3,5,8,9,10]
#travel_dates = range(30)
def normalize(data):
L = 30
d1 = []
for i in xrange(L):
d1.append(1 if (i+1) in data else 0)
return d1
def group_func(d):
L = len(d)
result = []
for i in xrange(L):
s = sum(d[i:i+7])
result.append((i,s))
return result
d1 = normalize(travel_dates)
mincost = 0
while True:
a = group_func(d1)
a.sort(key = itemgetter(1))
m = a[-1][1]
if m < 4:
break
for q in a:
if q[1] == m:
w = q
break
d1[w[0]:w[0]+7] = [0]*7
mincost = mincost + 7
mincost = mincost + d1.count(1) * 2
answer = min(25,mincost)
print "minimum cost = " + str(answer)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.