from functools import lru_cache
from typing import List
l = [100, 125, 185, 60, 195, 25]
def cache(f): return lru_cache(maxsize=None)(f)
class Solution:
def canPartition(self, nums: List[int]) -> bool:
totalSum = sum(nums)
if totalSum % 2 == 1:
return False
@cache
def helper(index, setOne):
print(setOne, index)
if setOne < 0:
return False
if setOne == 0:
return True
for x in range(index, len(nums)):
if helper(x +1, setOne - nums[x]):
return True
return False
return helper(0,totalSum // 2)
class Solution2:
def canPartition(self, nums):
@cache
def subsetSum(s, i):
print(s, i)
if s == 0: return True
if i >= len(nums) or s < 0: return False
return subsetSum(s-nums[i], i+1) or subsetSum(s, i+1)
total_sum = sum(nums)
return total_sum & 1 == 0 and subsetSum(total_sum // 2, 0)
print(Solution2().canPartition(l))
print()
print(Solution().canPartition(l))
ZnJvbSBmdW5jdG9vbHMgaW1wb3J0IGxydV9jYWNoZQpmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAoKbCA9IFsxMDAsIDEyNSwgMTg1LCA2MCwgMTk1LCAyNV0KCmRlZiBjYWNoZShmKTogcmV0dXJuIGxydV9jYWNoZShtYXhzaXplPU5vbmUpKGYpCgpjbGFzcyBTb2x1dGlvbjoKICAgIGRlZiBjYW5QYXJ0aXRpb24oc2VsZiwgbnVtczogTGlzdFtpbnRdKSAtPiBib29sOgogICAgICAgIHRvdGFsU3VtID0gc3VtKG51bXMpIAogICAgICAgIGlmIHRvdGFsU3VtICUgMiA9PSAxOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBAY2FjaGUKICAgICAgICBkZWYgaGVscGVyKGluZGV4LCBzZXRPbmUpOgogICAgICAgICAgICBwcmludChzZXRPbmUsIGluZGV4KQogICAgICAgICAgICBpZiBzZXRPbmUgPCAwOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGlmIHNldE9uZSA9PSAwOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZm9yIHggaW4gcmFuZ2UoaW5kZXgsIGxlbihudW1zKSk6CiAgICAgICAgICAgICAgICBpZiBoZWxwZXIoeCArMSwgc2V0T25lIC0gbnVtc1t4XSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIGhlbHBlcigwLHRvdGFsU3VtIC8vIDIpCgpjbGFzcyBTb2x1dGlvbjI6CiAgICBkZWYgY2FuUGFydGl0aW9uKHNlbGYsIG51bXMpOgogICAgICAgIEBjYWNoZQogICAgICAgIGRlZiBzdWJzZXRTdW0ocywgaSk6CiAgICAgICAgICAgIHByaW50KHMsIGkpCiAgICAgICAgICAgIGlmIHMgPT0gMDogcmV0dXJuIFRydWUKICAgICAgICAgICAgaWYgaSA+PSBsZW4obnVtcykgb3IgcyA8IDA6IHJldHVybiBGYWxzZQogICAgICAgICAgICByZXR1cm4gc3Vic2V0U3VtKHMtbnVtc1tpXSwgaSsxKSBvciBzdWJzZXRTdW0ocywgaSsxKQogICAgICAgIHRvdGFsX3N1bSA9IHN1bShudW1zKQogICAgICAgIHJldHVybiB0b3RhbF9zdW0gJiAxID09IDAgYW5kIHN1YnNldFN1bSh0b3RhbF9zdW0gLy8gMiwgMCkKCnByaW50KFNvbHV0aW9uMigpLmNhblBhcnRpdGlvbihsKSkKcHJpbnQoKQpwcmludChTb2x1dGlvbigpLmNhblBhcnRpdGlvbihsKSk=