@@ -3,6 +3,23 @@ class Solution:
33 # Time: O(n * sum)
44 # Space: O(sum)
55 def can_partition (self , nums : list [int ]) -> bool :
6+ """
7+ Example: nums = [1, 5, 11, 5], target = 11
8+
9+ Initial: dp = [T, F, F, F, F, F, F, F, F, F, F, F]
10+ 0 1 2 3 4 5 6 7 8 9 10 11
11+
12+ After num=1: [T, T, F, F, F, F, F, F, F, F, F, F]
13+ └─┘ (can make sum 1)
14+
15+ After num=5: [T, T, F, F, F, T, T, F, F, F, F, F]
16+ └─┘ └─┘ └─┘ (can make sums 5,6)
17+
18+ After num=11:[T, T, F, F, F, T, T, F, F, F, F, T]
19+ └─┘ (target!)
20+
21+ Backward iteration prevents using same number twice
22+ """
623 total = sum (nums )
724 if total % 2 :
825 return False
@@ -20,3 +37,57 @@ def can_partition(self, nums: list[int]) -> bool:
2037 return True
2138
2239 return False
40+
41+
42+ class SolutionBitset :
43+ # Time: O(n * sum)
44+ # Space: O(1)
45+ def can_partition (self , nums : list [int ]) -> bool :
46+ """
47+ Example: nums = [1, 5, 11, 5], target = 11
48+
49+ Bitset representation (bit position = achievable sum):
50+
51+ Initial: dp = 1 (binary: 1)
52+ Bits: ...0001
53+ Sums: {0}
54+
55+ After num=1: dp |= dp << 1
56+ a = dp = 1 (bin: 0001)
57+ b = dp << 1 = 2 (bin: 0010)
58+ c = a | b = 3 (bin: 0011)
59+ Sums: {0, 1}
60+
61+ After num=5: dp |= dp << 5
62+ a = dp = 3 (bin: 0000011)
63+ b = dp << 5 = 96 (bin: 1100000)
64+ c = a | b = 99 (bin: 1100011)
65+ Sums: {0, 1, 5, 6}
66+
67+ After num=11: dp |= dp << 11
68+ a = dp = 99 (bin: 00000001100011)
69+ b = dp << 11 = 202752 (bin: 110001100000000)
70+ c = a | b = 202851 (bin: 110001101100011)
71+ Sums: {0, 1, 5, 6, 11, 12, 16, 17}
72+
73+ Check: (dp & (1 << 11)) != 0
74+ a = dp = 202851 (bin: 110001101100011)
75+ b = 1 << 11 = 2048 (bin: 100000000000)
76+ c = a & b = 2048 (bin: 100000000000)
77+ c != 0 → bit 11 is set → True!
78+ """
79+ total = sum (nums )
80+ if total % 2 != 0 :
81+ return False
82+
83+ target = total // 2
84+ dp = 1
85+
86+ for num in nums :
87+ dp |= dp << num
88+
89+ # Early termination: found target sum!
90+ if (dp & (1 << target )) != 0 :
91+ return True
92+
93+ return False
0 commit comments