Schedule Optimization With Priority and Weighted Costs
We can construct a directed graph with events as vertices, where an event $E_2$ has an incoming edge from another event $E_1$ if starting from $E_1$, we can arrive $E_2$ in time to get its reward. The edge value is the time difference between the events.
For each vertex (event), we do a depth first search rooted at this vertex where on each iteration we add the value of the previous tree edge to the current tree edge and check to see if it is greater than the time associated with the current vertex. If it is then our considered sequence of events from the root vertex has just timed out.
var MaxReward = 0
var bestItinerary = []

f(graph):
  for vertex v in graph:
    _f(v, v.time, 0, [])

_f(v, curr_time, rewardSoFar):
  if time &gt; v.time:
    if rewardSoFar &gt; MaxReward:
      MaxReward = rewardSoFar
      bestItinerary = itinerarySoFar
  else
    rewardSoFar = rewardSoFar + v.reward
    itinerarySoFar.append(v)
    for edge, neighbor in v.getNeighbors:
      _f(neighbor, curr_time + edge.value, rewardSoFar, itinerarySoFar)