The installed cover is NP-hard, so it is unlikely that the algorithm will be much more effective than looking at all possible combinations of sets, and checking if each combination is a cover.
Basically, look at all the combinations from 1 set, then 2 sets, etc., until they form a cover.
EDIT
This is an example of pseudo code. Please note that I am not saying that this is effective. I simply argue that there is no more efficient algorithm (the algorithms will be worse than polynomial time if something really cool is not found)
for size in 1..|S|:
for C in combination(S, size):
if (union(C) == U) return C
combination(K, n) n, K.
, . , , . ( ). .
combination(K, n):
if n == 0: return [{}]
r = []
for k in K:
K = K \ {k}
for s in combination(K, n-1):
r.append(union({k}, s))
return r
, , n == 0. .