You could use lmfit to constrain you parameters. For the following plot, I constrained your parameters a and b to the range [0,20] (which you mentioned in your post) and c to the range [0, 400]. The parameters you get are:
a:   19.9999991
b:   0.46769173
c:   274.074071
and the corresponding plot looks as follows:

As you can see, the model reproduces the data reasonable well and the parameters are in the given ranges.
Here is the code that reproduces the results with additional comments:
from lmfit import minimize, Parameters, Parameter, report_fit
import numpy as np
x=[24,25,28,37,58,104,200,235,235]  
y=[340,350,370,400,430,460,490,520,550]  
def fit_fc(params, x, data):  
    a = params['a'].value
    b = params['b'].value
    c = params['c'].value
    model = np.power(x,b)*a + c
    return model - data #that's what you want to minimize
# create a set of Parameters
#'value' is the initial condition
#'min' and 'max' define your boundaries
params = Parameters()
params.add('a', value= 2, min=0, max=20) 
params.add('b', value= 0.5, min=0, max=20)
params.add('c', value= 300.0, min=0, max=400) 
# do fit, here with leastsq model
result = minimize(fit_fc, params, args=(x, y))
# calculate final result
final = y + result.residual
# write error report
report_fit(params)
#plot results
try:
    import pylab
    pylab.plot(x, y, 'k+')
    pylab.plot(x, final, 'r')
    pylab.show()
except:
    pass
If you constrain all of your parameters to the range [0,20], the plot looks rather bad:
