def tsum(currentSum,total,input,record,n):
if total == N :
for i in range(0,n):
if record[i]:
print input[i]
i = i+1
for i in range(i,n):
if record[i]:
print input[i]
print ""
return
i=currentSum
for i in range(i,n):
if total+input[i]>sum :
continue
if i>0 and input[i]==input[i-1] and not record[i-1] :
continue
record[i]=1
tsum(i+1,total+input[i],input,record,l)
record[i]=0
record = []
N = 5
input = [3, 2, 2, 1, 1]
temp = list(set(input))
newlist = input
for i in range(0, len(list(set(input)))):
val = N/temp[i]
for j in range(0, val-input.count(temp[i])):
newlist.append(temp[i])
l = len(input)
for i in range(0,l):
record.append(0)
print "all possibilities to get N using values from a given set:"
output = []
tsum(0,0,input,record,l)
ZGVmIHRzdW0oY3VycmVudFN1bSx0b3RhbCxpbnB1dCxyZWNvcmQsbik6CiAgICAgaWYgdG90YWwgPT0gTiA6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCxuKToKICAgICAgICAgICAgaWYgcmVjb3JkW2ldOgogICAgICAgICAgICAgICAgcHJpbnQgaW5wdXRbaV0KCiAgICAgICAgICAgIGkgPSBpKzEKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoaSxuKToKICAgICAgICAgICAgICAgIGlmIHJlY29yZFtpXToKICAgICAgICAgICAgICAgICAgICBwcmludCBpbnB1dFtpXQogICAgICAgICAgICBwcmludCAiIgogICAgICAgICAgICByZXR1cm4KICAgICBpPWN1cnJlbnRTdW0KICAgICBmb3IgaSBpbiByYW5nZShpLG4pOgogICAgICAgICBpZiB0b3RhbCtpbnB1dFtpXT5zdW0gOgogICAgICAgICAgICAgY29udGludWUKICAgICAgICAgaWYgaT4wIGFuZCBpbnB1dFtpXT09aW5wdXRbaS0xXSBhbmQgbm90IHJlY29yZFtpLTFdIDoKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIHJlY29yZFtpXT0xCiAgICAgICAgIHRzdW0oaSsxLHRvdGFsK2lucHV0W2ldLGlucHV0LHJlY29yZCxsKQogICAgICAgICByZWNvcmRbaV09MAoKcmVjb3JkID0gW10KTiA9IDUKaW5wdXQgPSBbMywgMiwgMiwgMSwgMV0KdGVtcCA9IGxpc3Qoc2V0KGlucHV0KSkKbmV3bGlzdCA9IGlucHV0CmZvciBpIGluIHJhbmdlKDAsIGxlbihsaXN0KHNldChpbnB1dCkpKSk6CiAgICB2YWwgPSBOL3RlbXBbaV0KICAgIGZvciBqIGluIHJhbmdlKDAsIHZhbC1pbnB1dC5jb3VudCh0ZW1wW2ldKSk6CiAgICAgICAgbmV3bGlzdC5hcHBlbmQodGVtcFtpXSkKCmwgPSBsZW4oaW5wdXQpCgpmb3IgaSBpbiByYW5nZSgwLGwpOgogICAgcmVjb3JkLmFwcGVuZCgwKQpwcmludCAiYWxsIHBvc3NpYmlsaXRpZXMgdG8gZ2V0IE4gdXNpbmcgdmFsdWVzIGZyb20gYSBnaXZlbiBzZXQ6IgpvdXRwdXQgPSBbXQp0c3VtKDAsMCxpbnB1dCxyZWNvcmQsbCk=