N,S=map(int,input().split())
nums=list(map(int,input().split()))
nums2=nums[0:int(N/2)]
nums3=nums[int(N/2):int(N+1)]
result=[]
result2=[]
l=0
r=0
count=0
def reculse(count,sum):
if count==len(nums2):
result.append(sum)
return
reculse(count+1,sum)
reculse(count+1,sum=sum+nums2[count])
def reculse2(count,sum):
if count==len(nums3):
result2.append(sum)
return
reculse2(count+1,sum)
reculse2(count+1,sum=sum+nums3[count])
reculse(0,0)
reculse2(0,0)
result.sort()
result2.sort()
result.remove(0)
result2.remove(0)
count+=result.count(S)
count+=result2.count(S)
tt=len(result2)
while l<=len(result)-1:
if result[l]+result2[r]==S:
count+=1
if result[l]+result2[r]>S:
l+=1
tt=r
r=0
continue
r+=1
if r==tt:
l+=1
r=0
continue
print(count)
http://boj.kr/b7d792184c4f4f8ebe2a74dd6bdf8b71
1182랑 똑같은 문제인데
입력수 늘어나서 더 효율적으로 짜야하는 문제임.
할 수 있는 최대한으로 해봤는데, 틀 자체가 문제인걸까 아니면 조금만 보완하면 가능할까? ㅜㅜ
진짜 이것 때문에 미칠 것 같다.
위 코드는 1182에선 통과되긴함
시바 닉네임엔 c들어가는데 파이썬 코드인거 화나네
학교 알고리즘 수업이 파이썬 쓴대서 ㅠㅠ
배열 두개로 나눈다음 재귀돌리고 정렬한다음 각 배열 비교하다가 만약 구하는 수보다 크면 오른쪽 배열의 검사사거리(?)를 줄이는 방식
그냥 10개씩 모아서 비트마스킹으로 브루트포스때리믄 될텐데
아 1208이 안되는거구나
비트마스킹 어캐함 ㅜㅜ
ㅇㅇ 1208이 안됨. 힌트 좀 얻어서 배열 두개로 나눠 푸는거라 길래 나누긴 했는데. 나눠도 그 다음 방식에서 효율적이지 못하면 통과 못하는듯 ㅠㅠ
절반으로 나누는건 맞음 이제 합을 저장하는 방식이 일렬로 쭉 저장하고 있잖음 그걸 길이 2백만짜리 배열에 result[sum] += 1하는 식으로 갯수만 세주셈
아 그거구나. 그거도 시도해보려 했는데 합이 음수인 경우는 오류 뜨지 않아?
그 방식은 너가 생각해낸거임? 아니면 그게 비트마스킹이라는 거야?
그럼 길이 4백만으로 해서 sum에 2백만 더하고 작업하던지 dict쓰면 되겠네
감사 ㅜㅜ 일단 그 방식 연구해볼게
비트마스킹은 그냥 정수를 2진법으로 바꿔서 집합을 표현하는 기법임 자세히는 직접 구글링 ㄱㄱ 여기선 큰 관련이 없을듯
reculse라써서그럼
이거 걍
https://blog.naver.com/kks227/221382873753
meet in the middle 공부하고 보셈
ㄳ 뭔가 이거 알아야 될 거 같음
밋인더미들 모르고 풀기는좀 어려움
이거 fft로 풀림