Minimum perfect squares needed to sum up to a target
I won't specifically address the execution time concerns to begin with; there are other issues:

Don't use a class

There's no reason for this to be a class. You have one method and you don't even reference self. In theory you could remove self and mark it a @staticmethod, but really it should just be a function without a class.

Reuse variables

Make this variable -

i2 = i**2


since it's used twice. The same goes for min_coins_to_make[target].

Loop limit

    for coin in coins:
        if coin &gt; n:
            break 


That termination condition will be true if coin &gt; n, but coin == i**2. i**2 &gt; n will never be true, because in the previous loop,

        if i**2&gt;n:
            break 


So can't you just write for coin in coins without an interior termination condition?