Distribution of $10$ unique coins You have $10$ coins each with a different probability ($p$) of landing heads. $p = [.05,.1,.15,.2,.25,...,.45,.5].$
What is the likelihood that at least $5$ coins land heads? Is there any more efficient way of calculating than doing the grunt work calculation of all the probabilities of the different outcomes?
 A: An efficient way of doing the grunt work would be to use probability generating functions.
Given a discrete random variable $X$ which takes values in $\{0,1,2,\ldots\}$ the probability generating function $G_X$ is defined as,
$$ G_X(s) = \mathbb{E}[s^X] = \sum_{k=0}^{\infty}\mathbb{P}(X=k) s^k $$
Probability generating functions have some useful properties. Specifically, the coefficient of the $s^k$ term gives the probability that $X=k$. Therefore, given the generating function $G_X$ of $X$, we can compute, 
$$ \mathbb{P}(X=k) = \left[ \frac{d^k}{s^k} G_X(s) \right]_{s=0} $$
Given independent random variables $X$ and $Y$ with probability generating functions $G_X$ and $G_Y$, the sum of the variables has generating function,
$$G_{X+Y}(s) = G_X(s)G_Y(s)$$
Suppose $X$ is heads with probability $p$. Then $X$ has probability generating function,
$$ G_X(s) = (1-p) + ps $$
In your case, you can compute the probability generating function of each of the coins and use this to compute the generating function of their sum. You can then use the formula above to compute 
$$\mathbb{P}(sum \geq 5) = \sum_{k=5}^{\infty} \mathbb{P}(sum=k) $$
If you want an exact answer, I would suggest using something like Mathematica or Sympy to help with this computation. Otherwise you could do it numerically in python
For instance,
p = {1/20, 1/10, 3/20, 1/5, 1/4, 3/10, 7/20, 2/5, 9/20, 1/2}
k = 5
Total[CoefficientList[Fold[Times, Map[(1 - #) + # s &, p]], s][[k + 1 ;;]]]

This gives,
$$ \mathbb{P}(sum \geq 5) = \frac{311889001}{3200000000} \approx 0.0974653$$
If we think about what is going on, we are really just using polynomials in the variable $s$ to keep track of all of the "grunt work" which we would have to do if we wanted to write down all the combinations of ways to get a certain number of heads.
A: Typically conditional probability is the most efficient computationally. Here is an example python code for your case:
 def pgtk(ps, k) :
  if k == 0 :
    return 1

  if len(ps) < k:
    return 0

  return ps[0] * pgtk(ps[1:], k-1) + (1-ps[0])*pgtk(ps[1:],k)


 >>>>  pgtk([0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5], 5) 
       0.0974653128125

