def promising(k, s, r):
    return (s + r >= target) and (s == target or s + w[k + 1] <= target)


def SumOfSubsets(k, s, r):
    if promising(k, s, r):
        if s == target:
            subset = []
            for i in range(1, len(w)):
                if x[i] == 1:
                    subset.append(w[i])
            print(subset)
        else:
            x[k + 1] = 1
            SumOfSubsets(k + 1, s + w[k + 1], r - w[k + 1])

            x[k + 1] = 0
            SumOfSubsets(k + 1, s, r - w[k + 1])


# Example
w = [0, 5, 10, 12, 13, 15, 18]  # 1-based indexing
target = 30

x = [0] * len(w)

SumOfSubsets(0, 0, sum(w))
