def memoizedSubset(target, numberList, memo):
''' Returns True if there exists a subset of numberList that adds
up to target and returns False otherwise.'''
if target == 0:
return True;
elif numberList == ():
return False;
elif (target, numberList) in memo:
return memo[(target, numberList)];
elif numberList[0] > target:
solution = memoizedSubset(target, numberList[1:], memo);
memo[(target, numberList)] = solution;
return solution;
else:
useIt = memoizedSubset(target - numberList[0], numberList, memo);
loseIt = memoizedSubset(target, numberList[1:], memo);
solution = useIt or loseIt;
memo[(target, numberList)] = solution;
return solution;
print(memoizedSubset(50, (2, 3, 5), {}));
ZGVmIG1lbW9pemVkU3Vic2V0KHRhcmdldCwgbnVtYmVyTGlzdCwgbWVtbyk6CiAgICAnJycgUmV0dXJucyBUcnVlIGlmIHRoZXJlIGV4aXN0cyBhIHN1YnNldCBvZiBudW1iZXJMaXN0IHRoYXQgYWRkcwogICAgICAgIHVwIHRvIHRhcmdldCBhbmQgcmV0dXJucyBGYWxzZSBvdGhlcndpc2UuJycnCiAgICBpZiB0YXJnZXQgPT0gMDoKICAgICAgICByZXR1cm4gVHJ1ZTsKICAgIGVsaWYgbnVtYmVyTGlzdCA9PSAoKToKICAgICAgICByZXR1cm4gRmFsc2U7CiAgICBlbGlmICh0YXJnZXQsIG51bWJlckxpc3QpIGluIG1lbW86CiAgICAgICAgcmV0dXJuIG1lbW9bKHRhcmdldCwgbnVtYmVyTGlzdCldOwogICAgZWxpZiBudW1iZXJMaXN0WzBdID4gdGFyZ2V0OgogICAgICAgIHNvbHV0aW9uID0gbWVtb2l6ZWRTdWJzZXQodGFyZ2V0LCBudW1iZXJMaXN0WzE6XSwgbWVtbyk7CiAgICAgICAgbWVtb1sodGFyZ2V0LCBudW1iZXJMaXN0KV0gPSBzb2x1dGlvbjsKICAgICAgICByZXR1cm4gc29sdXRpb247CiAgICBlbHNlOgogICAgICAgIHVzZUl0ID0gbWVtb2l6ZWRTdWJzZXQodGFyZ2V0IC0gbnVtYmVyTGlzdFswXSwgbnVtYmVyTGlzdCwgbWVtbyk7CiAgICAgICAgbG9zZUl0ID0gbWVtb2l6ZWRTdWJzZXQodGFyZ2V0LCBudW1iZXJMaXN0WzE6XSwgbWVtbyk7CiAgICAgICAgc29sdXRpb24gPSB1c2VJdCBvciBsb3NlSXQ7CiAgICAgICAgbWVtb1sodGFyZ2V0LCBudW1iZXJMaXN0KV0gPSBzb2x1dGlvbjsKICAgICAgICByZXR1cm4gc29sdXRpb247CgpwcmludChtZW1vaXplZFN1YnNldCg1MCwgKDIsIDMsIDUpLCB7fSkpOw==