4개를 모두 골라서 가 맞는지 비교하는 것은 지나치게 큰 비용을 요구한다.
2개씩 골라서 합을 구해 비교하는 방식을 사용해야 한다.
이며 을 만족하는 을 뽑는 과정을 보자.
import sys
input = sys.stdin.readline
w, n = map(int, input().rstrip().split())
arr = sorted(list(map(int, input().rstrip().split())))
mem = [-1 for _ in range(800000)]
def find():
for i in range(n):
if arr[i] >= w:
return False
for j in range(i+1, n):
res = arr[i]+arr[j]
# arr는 정렬되어 있음
if res >= w:
break
# 값이 존재하지 않음
if mem[res] < 0:
mem[res] = j
else:
mem[res] = min(mem[res], j)
# 저장 후 조건에 맞는 값이 존재하는지 찾음
if mem[w-res] > -1 and mem[w-res] < i:
return True
if find():
print('YES')
else:
print('NO')