배낭의 크기가 7이고, 4개의 물건의 무게와 가치가 다음과 같다고 가정해보자.
2차원 배열을 만들고 각 행과 열에 최대 가치를 저장해 나간다.
i
은 물건을, 열 j
은 가방의 최대 무게를 의미한다. 최대 가치를 저장하는 방법은 다음과 같다.
i
을 가방에 넣을 수 있을 때 (물건의 무게가 가방의 크기보다 작을 때)dp[i-1][j]
에 저장된 값의 최댓값이 최대 가치dp[i-1][j]
에 저장된 값을 그대로 저장한다. 최종 결과는 dp[n][k]
에 저장된다. (n
은 물건의 개수, k
는 배낭의 크기)
dp[0][j]
에 저장된 값을 저장한다. 이 경우에는 모두 0이다. dp[1][1]
= 13+0 = 13 이 저장된다.dp[1][j]
에 저장된 값을 저장한다. 이 경우에는 모두 0이다.dp[1][4]
에 저장된 값을 비교하여 최댓값을 저장한다. 이 때는 위에 저장된 값이 0이므로 8이 저장된다.dp[2][1]
= 8+0 = 8 이 저장된다.dp[2][2]
= 8+0 = 8, 8+dp[2][3]
= 8+0 = 8을 계산할 수 있지만 위에 저장된 값(dp[1][j])과 비교했을때 최댓값인 13이 각각 저장된다.dp[n][k]
에 저장된 14가 배낭이 담을 수 있는 최대 가치가 된다. n, k = map(int, input().split()) # 물건 개수, 배낭 크기
dp = [[0 for _ in range(k + 1)] for _ in range(n + 1)] # 배열
item = [[0, 0]]
for i in range(1, n + 1): # 물건의 무게, 가치 입력
item.append(list(map(int, input().split())))
Max = 0
for i in range(1, n + 1): # 물건 개수만큼 반복
for j in range(1, k + 1): # 배낭의 크기까지 반복
weight = item[i][0]
value = item[i][1]
# 가방에 넣을 수 없으면 위의 값 그대로 가져오기
if j < weight:
dp[i][j] = dp[i - 1][j]
# 가방에 넣을 수 있으면
# 위에 값 vs (현재 아이템 가치 + 그전 단계에서 구한 남은무게의 가치)
else:
dp[i][j] = max(dp[i - 1][j],value + dp[i - 1][j - weight])
print(dp[n][k])
i
번째 동전까지 고려하고, j
원의 거스름돈을 돌려줄 때 최소 동전 개수를 dp[i][j]
로 정의j
를 동전으로 나눈 나머지가 0이라면j//coins[i]
만큼 넣을 수 있음j
를 동전으로 나눈 나머지가 0이 아니라면dp[i][j-coin[i]]
)에 최적화된 값을 더한 것과, 위 인덱스에 저장된 값 비교하여 최솟값 저장dp[n][amount]
에 최종 결과가 저장된다. (n
은 동전의 종류)coins = list(map(int, input().split())) # 동전
n = len(coins) # 동전 종류
changes = int(input()) # 거슬러주어야 할 돈
dp = [[10001 for _ in range(changes+1)] for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, changes+1):
# 나머지가 0이라면 -> 그 동전 넣을 수 있음
if j%coin[i] == 0:
dp[i][j] = j//coins[i]
# 나머지가 0이 아니라면 -> 몫 만큼 넣고 남은 금액 생각하기
else:
# 동전금액이 거스름돈보다 크면 넣을 수 없음
if j < coins[i]:
# 위에 저장된 값 저장
dp[i][j] = dp[i-1][j]
# 넣을 수 있으면
# 위에 저장된 값과 계산한 값 비교하여 최솟값 저장
else:
dp[i][j]=min(dp[i-1][j],1+dp[i][j-coin[i]])
if dp[N][K] == 10001:
print('불가능')
else:
print(dp[N][K])
백준 11047 - 동전 0
백준 2293 - 동전 1
백준 2294 - 동전 2
댓글과 좋아요 그리고 의견 감사합니다 ♥️
지은아 너는 프론트 가야겠다 엄청 깔끔하네