DP DP DP
import sys
# 최대 K만큼의 무게만을 넣을 수 있는 배낭만
n,k = map(int, sys.stdin.readline().rstrip().split())
# N : 첫 줄에 물품의 수
# K : 준서가 버틸 수 있는 무게
wvsave = []
# W, V : 무게, 즐거움
for i in range(n) :
w,v = map(int, sys.stdin.readline().rstrip().split())
wvsave.append((w,v))
bag = [0 for _ in range(k+1)]
for b in range(n) :
w,v = wvsave[b]
for m in range(k, w-1, -1) : # 주석 참고
bag[m] = max(bag[m], bag[m-w]+v)
print(bag[-1])
# 처음에는 인덱스 0 부터 끝까지로 했는데, 이러면 누적됨
# (ex) 아래같이 input 들어오고 0->3 검사하면
# (0, 5, 10, 15) 일케 쌓임
# 3 5
# 4 2
# 3 4
# 1 5
# 따라서 3->0 으로 검사하면 (0, 5, 5, 5) 로 쌓임
import sys
# 최대 K만큼의 무게만을 넣을 수 있는 배낭만
n,k = map(int, sys.stdin.readline().rstrip().split())
# N : 첫 줄에 물품의 수
# K : 준서가 버틸 수 있는 무게
wvsave = []
# W, V : 무게, 즐거움
for i in range(n) :
w,v = map(int, sys.stdin.readline().rstrip().split())
wvsave.append((w,v))
bag = [0 for _ in range(k+1)]
for b in range(n) :
w,v = wvsave.pop()
for k in range(w,k+1) :
bag[k] = max(bag[k-w]+v, bag[k])
print(bag[-1])
그렇게 하면 n이 1 인 경우에는 에러가 나게 되지
import sys
# 최대 K만큼의 무게만을 넣을 수 있는 배낭만
n,k = map(int, sys.stdin.readline().rstrip().split())
# N : 첫 줄에 물품의 수
# K : 준서가 버틸 수 있는 무게
wvsave = []
# W, V : 무게, 즐거움
for i in range(n) :
w,v = map(int, sys.stdin.readline().rstrip().split())
wvsave.append((w,v))
bag = [0 for _ in range(k+1)]
wvsave.sort(reverse=True)
for b in range(1,n) :
w,v = wvsave[b]
for m in range(k, w-1, -1) :
bag[m] = max(bag[m], bag[m-w]+v)
# print()
# print(bag)
print(bag[-1])
출처 : 출처