from collections import defaultdict
CS = defaultdict(lambda: defaultdict(int))
def zeroOneKnapSack(numItems, sackSize, weights, values):
if CS[numItems][sackSize] != 0:
return CS[numItems][sackSize]
if (numItems == 0) or (sackSize==0):
CS[numItems][sackSize] = 0
return 0
if weights[numItems] > sackSize:
CS[numItems][sackSize] = zeroOneKnapSack(numItems-1, sackSize, weights, values)
return CS[numItems][sackSize]
CS[numItems][sackSize] = max( values[numItems]+zeroOneKnapSack(numItems-1, sackSize-weights[numItems], weights, values),
zeroOneKnapSack(numItems-1, sackSize, weights, values) )
return CS[numItems][sackSize]
weights = [5,4,6,3]
values = [10,40,30,50]
sackSize = 10
#another testcase
# weights = [1,3,4,5]
# values = [1,4,5,7]
# sackSize = 7
numItems = len(weights)-1 #could also use len(values)-1
print zeroOneKnapSack(numItems, sackSize, weights, values)
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKQ1MgPSBkZWZhdWx0ZGljdChsYW1iZGE6IGRlZmF1bHRkaWN0KGludCkpCmRlZiB6ZXJvT25lS25hcFNhY2sobnVtSXRlbXMsIHNhY2tTaXplLCB3ZWlnaHRzLCB2YWx1ZXMpOgogICAgIAogICAgaWYgQ1NbbnVtSXRlbXNdW3NhY2tTaXplXSAhPSAwOgogICAgICAgIHJldHVybiBDU1tudW1JdGVtc11bc2Fja1NpemVdCiAgICBpZiAobnVtSXRlbXMgPT0gMCkgb3IgKHNhY2tTaXplPT0wKToKICAgICAgICBDU1tudW1JdGVtc11bc2Fja1NpemVdID0gMAogICAgICAgIHJldHVybiAwCiAgICBpZiB3ZWlnaHRzW251bUl0ZW1zXSA+IHNhY2tTaXplOgogICAgICAgIENTW251bUl0ZW1zXVtzYWNrU2l6ZV0gPSB6ZXJvT25lS25hcFNhY2sobnVtSXRlbXMtMSwgc2Fja1NpemUsIHdlaWdodHMsIHZhbHVlcykKICAgICAgICByZXR1cm4gQ1NbbnVtSXRlbXNdW3NhY2tTaXplXQogCiAgICBDU1tudW1JdGVtc11bc2Fja1NpemVdID0gbWF4KCB2YWx1ZXNbbnVtSXRlbXNdK3plcm9PbmVLbmFwU2FjayhudW1JdGVtcy0xLCBzYWNrU2l6ZS13ZWlnaHRzW251bUl0ZW1zXSwgd2VpZ2h0cywgdmFsdWVzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvT25lS25hcFNhY2sobnVtSXRlbXMtMSwgc2Fja1NpemUsIHdlaWdodHMsIHZhbHVlcykgKQogICAgIAogICAgcmV0dXJuIENTW251bUl0ZW1zXVtzYWNrU2l6ZV0KCgp3ZWlnaHRzID0gWzUsNCw2LDNdCnZhbHVlcyA9IFsxMCw0MCwzMCw1MF0Kc2Fja1NpemUgPSAxMAojYW5vdGhlciB0ZXN0Y2FzZQojIHdlaWdodHMgPSBbMSwzLDQsNV0KIyB2YWx1ZXMgPSBbMSw0LDUsN10KIyBzYWNrU2l6ZSA9IDcKbnVtSXRlbXMgPSBsZW4od2VpZ2h0cyktMSAjY291bGQgYWxzbyB1c2UgbGVuKHZhbHVlcyktMQpwcmludCB6ZXJvT25lS25hcFNhY2sobnVtSXRlbXMsIHNhY2tTaXplLCB3ZWlnaHRzLCB2YWx1ZXMp