https://www.acmicpc.net/problem/12865
점화식 세우지 못한 상황을 받아들이고 그냥 한 번 아이디어 보면서 만들어보니 되긴 되더라.
근데 막판에 인덱스 관련해서 좀 많이 얼타가지고 파일럿 코가 해결해주었다.
어느 순간 파일럿 코에게 코드의 끝 마무리 할 기회를 던지는 것 같아서 기분이 안좋다. 처음부터 끝까지 내가 한 코드가 있는걸까.
핵심 식은 2차원 배열에 각 가방과 짐에 대한 점진적 배치 또는 증가 식을 놓는다.
- 담을 수 없어?
- 그럼 [i - 1][j] 과 동일하다.
- 담을 수 있어?
- 그럼 [i - 1][j] 랑 해당 아이템을 포함한 데이터를 구성하여 그 중 더 많은 가치의 값으로 구성한다.
- itemList[j].value + bag[i - itemList[j].kg][j] 뭐 이런식..
- 중요 한 것은 value가 빠진 만큼 bag은 그 value가 빠진 영역에서 내용을 찾아온다는 것이다.
- 그럼 [i - 1][j] 랑 해당 아이템을 포함한 데이터를 구성하여 그 중 더 많은 가치의 값으로 구성한다.
실패한 코드
import sys
input = sys.stdin.readline
itemCount, backPackStatus = map(int, input().split())
itemList = []
maxBagUse = [[0] * (itemCount) for _ in range(backPackStatus + 1)]
for i in range(itemCount):
kg, value = map(int, input().split())
itemList.append([kg, value])
# 이렇게 되면 itemList[n]의 [0]은 kg, [1]은 value가 된다.
for i in range(1, backPackStatus + 1):
for j in range(itemCount):
if(itemList[j][0] > i):
maxBagUse[i][j] = maxBagUse[i][j - 1]
else:
maxBagUse[i][j] = max(maxBagUse[i][j - 1], itemList[j][1] + maxBagUse[i - itemList[j][0]][j - 1])
print(maxBagUse[backPackStatus][itemCount - 1])
통과 코드
import sys
input = sys.stdin.readline
itemCount, backPackStatus = map(int, input().split())
itemList = []
maxBagUse = [[0] * (itemCount + 1) for _ in range(backPackStatus + 1)] # itemCount + 1로 수정
for i in range(itemCount):
kg, value = map(int, input().split())
itemList.append([kg, value])
for i in range(1, backPackStatus + 1):
for j in range(1, itemCount + 1): # j를 1부터 시작하도록 수정
if itemList[j - 1][0] > i:
maxBagUse[i][j] = maxBagUse[i][j - 1]
else:
maxBagUse[i][j] = max(maxBagUse[i][j - 1], itemList[j - 1][1] + maxBagUse[i - itemList[j - 1][0]][j - 1])
print(maxBagUse[backPackStatus][itemCount])
'문제풀이' 카테고리의 다른 글
[PY] 1541 : 잃어버린 괄호 (1) | 2025.04.09 |
---|---|
[PY] <!> 11049 : 행렬 곱셈 순서 (0) | 2025.04.09 |
[PY] 11047 : 동전 0 (1) | 2025.04.05 |
[PY] 2748 : 피보나치 수 2 (0) | 2025.04.05 |
[PY] 1904 : 01타일 (0) | 2025.04.05 |