Analytical solution
I haven't read all the posts, but here is my analytical solution, it is writen in python3, but it should also work with python2 if you change the print-function:
###############################################################
al=[]
s=0 # summ
# The Array "al" is filled with all possible combinations,
# it takes into account that rolling [1,1,1,1,2] got the same probability than rolling [2,1,1,1,1]
for a in range(1,7):
> for b in range(1,7):
>> for c in range(1,7):
>>> for d in range(1,7):
>>>> for e in range(1,7):
>>>>> al.append([a,b,c,d,e])
# sort the array and add the 3 highest throws
for i in range(6**5):
> al.sort()
> s=s+al[2]+al[3]+al[4]
## divide summ by the number of possibilitys
print(s/(6**5))
# solution: 13.43016975308642
#########################################
Even this is calculated with the pc its not brute-force, it takes each possibility (6^5) which can be rolled into account.
I hope this helps