package main import "fmt" func main() { nums := []int{1, 2} n := len(nums) for mask := 0; mask < (1 << n); mask++ { subset := []int{} for i := 0; i < n; i++ { if mask&(1<<i) != 0 { subset = append(subset, nums[i]) } } fmt.Println(subset) } }
The code loops from 0 to 3 (2^2 - 1). Each bit in mask represents whether to include an element.
Mask 0 (00 binary) means no elements: []
Mask 1 (01 binary) means include first element: [1]
Mask 2 (10 binary) means include second element: [2]
Mask 3 (11 binary) means include both: [1 2]
Each element can be either included or excluded, so total subsets = 2^n.
For n=5, total subsets = 2^5 = 32.
package main import "fmt" func main() { nums := []int{1, 2, 3} n := len(nums) for mask := 0; mask <= (1 << n); mask++ { subset := []int{} for i := 0; i < n; i++ { if mask&(1<<i) != 0 { subset = append(subset, nums[i]) } } fmt.Println(subset) } }
The loop runs mask from 0 to 8 inclusive (since n=3, 1<<3=8).
But valid masks are from 0 to 7 (0 to 2^3 - 1).
When mask=8, the inner loop tries to access nums[3], which is out of range.
package main import "fmt" func main() { nums := []int{2, 4, 6, 8} target := 10 n := len(nums) for mask := 0; mask < (1 << n); mask++ { subset := []int{} sum := 0 for i := 0; i < n; i++ { if mask&(1<<i) != 0 { subset = append(subset, nums[i]) sum += nums[i] } } if sum == target { fmt.Println(subset) } } }
Subsets that sum to 10 are [4, 6] and [2, 8].
Other subsets do not sum to 10.
There are 2^n subsets.
For each subset, we check up to n elements.
So total time is O(n * 2^n).
