코드 끄적임

부분집합에 대한 이해

아크몽 2024. 2. 1. 22:57

부분집합 알고리즘

for i in range(1,1<<n):
        sum, cnt = 0, 0
        for j in range(len(arr)):
            if i & (1<<j): #각 부분집합들을 표현해 주는 것
                sum += arr[j] # 부분집합 원소들의 누적 합
                cnt += 1 #cnt는 부분집합의 원소의 개수

1<<j 동작 방식

1<<0 : $(1)_2 => (1)_2$ = 1

1<<1 : $(1)_2 => (10)_2$ = 2

1<<2 : $(1)_2 => (100)_2$ = 4

1<<3: $(1)_2 => (1000)_2$ = 8

순서

(i,j), i & (1<<j)
(1, 0), 1 : 1 = $(1)_2$ = 1 , $(1)_2$ = 1 ⇒ 1 이 되서 True
(4, 2), 4 : $(100)_2$ = 4가 되서 ture

(17,0), 1: $(1)_2$ = 1이 되서 True

왜? 부분 집합 표현을 위해 이러한 식을 사용하는가?

해당 코드를 사용한 문제

swea D3 4837 부분집합 합 구하기

```
t= int(input())
arr = list(range(1,13))
N = len(arr)
for tc in range(1,t+1):
n,k = map(int,input().split())

ans = 0
for i in range(1,1<<n):
    sum, cnt = 0, 0
    for j in range(len(arr)):
        if i & (1<<j):
            sum += arr[j]
            cnt += 1
            print((i,j),1<<j)

    if sum == k and cnt == n:
        ans += 1
print(f'#{tc} {ans}')
```