20200804 // 삼성 SW Expert 아카데미 문제 // 3282
2020. 8. 4. 12:47ㆍProgramming/SW Expert Academy
삼성 SW Expert 아카데미 3282번 "0/1 Knapsack" 문제입니다.
TC = int(input())
def knapsack(W, wt, val, n): # W: 배낭의 무게한도, wt: 각 보석의 무게, val: 각 보석의 가격, n: 보석의 수
K = [[0 for x in range(W+1)] for x in range(n+1)] # DP를 위한 2차원 리스트 초기화
for i in range(n+1):
for w in range(W+1): # 각 칸을 돌면서
if i==0 or w==0: # 0번째 행/열은 0으로 세팅
K[i][w] = 0
elif wt[i-1] <= w: # 점화식을 그대로 프로그램으로
K[i][w] = max(val[i-1]+K[i-1][w-wt[i-1]], K[i-1][w]) # max 함수 사용하여 큰 것 선택
else:
K[i][w] = K[i-1][w]
return K[n][W]
ans = []
for tc in range(1, TC + 1):
k = "#"+str(tc)
wt = []
val = []
N, K = map(int, input().split())
for i in range(N):
w, v = map(int, input().split())
wt.append(w)
val.append(v)
k += " " + str(knapsack(K, wt, val, N))
ans.append(k)
for e in ans:
print(e)
DP로 유명한 Knapsack 문제이다. 공부를 하기 위해 다른 분의 블로그를 참고했다.
참고 블로그 : https://gsmesie692.tistory.com/113
Dynamic Programming: 배낭 채우기 문제 (Knapsack Problem)
도둑이 보석가게에 배낭을 메고 침입했다. 배낭의 최대 용량은 W이며, 이를 초과해서 보석을 담으면 배낭이 찢어질 것이다. 각 보석들의 무게와 가격은 알고 있다. 배낭이 찢어지지 않는 선에서
gsmesie692.tistory.com
DP 알고리즘 문제를 보면 막막했는데 이 분의 글을 참고하고 공부를 하니 좀 이해가 됐다. 다음 DP문제를 만나면 참고
해서 풀어봐야겠다.
'Programming > SW Expert Academy' 카테고리의 다른 글
20200807 // 삼성 SW Expert 아카데미 문제 // 1486 (0) | 2020.08.07 |
---|---|
20200806 // 삼성 SW Expert 아카데미 문제 // 5213 (0) | 2020.08.06 |
20200729 // 삼성 SW Expert 아카데미 문제 // 5549 (0) | 2020.07.29 |
20200728 // 삼성 SW Expert 아카데미 문제 // 5688 (0) | 2020.07.28 |
20200724 // 삼성 SW Expert 아카데미 문제 // 1954 (0) | 2020.07.24 |