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)
https://boj.kr/b7d792184c4f4f8ebe2a74dd6bdf8b71
1182랑 똑같은 문제인데
입력수 늘어나서 더 효율적으로 짜야하는 문제임.
할 수 있는 최대한으로 해봤는데, 틀 자체가 문제인걸까 아니면 조금만 보완하면 가능할까? ㅜㅜ
진짜 이것 때문에 미칠 것 같다.
위 코드는 1182에선 통과되긴함
2 ^ 20 이면 시간초과남? 알고리즘 좆밥의 견해로는 이거 dp 써야할거같은데
DP라는게 쓸모없는 반복 줄이는 거 맞나? 그래서 나름 정렬해서 쓸모없는 반복 줄어보려 했는데 이게 한계임
DP 가 한 번 계산하거는 캐싱해서 불필요한 반복 줄이는 거는 맞음