본문 바로가기
백준 C++

백준 12865번 평범한 배낭 C++

by Srff5123 2025. 5. 18.
728x90

 

1. 문제 설명

 

배낭 문제

여행에 가지고 갈 배낭을 최대한 가치 있게 싸려고 한다.

필요한 물건 N개가 있고, 가방에 넣을 수 있는 최대무게 K가 주어진다.

각 물건은 무게 w와 가치 v를 가지는데, 해당 물건을 잘 배낭에 넣어서 가져가면

가치 v만큼 즐길 수 있다. 가장 가치 있게 여행을 즐길 수 있도록 배낭을 싸는 프로그램을 작성하는 문제이다.

 

우선 입력값이 꽤 많으니 

해당 코드를 넣으며 시작하고

 

어떻게 하면 가치있게 넣을 수 있는지에 대한 점화식을 찾는다 dp 문제이다.

 

예시를 보면 무게와 가치가 같이 들어오기 떄문에 vector pair로 저장을 해주고

 

vector<int> dp 를 k + 1의 크기로 값을 0으로 선언하여 준다.

각 dp[j] 무게 j일 떄 만들 수 있는 최대 가치를 구해야 하며

0 부터 최대 무게 k까지 값을 저장해야 하기 때문에 k + 1로 선언한다.

 

j = k 최대무게로 하고 w 까지 --를 하는 것은

j >= w인 경우만 배낭에 물건을 넣을 수 있으므로 그렇게 반복해야 하며

그 이상은 반복할 필요가 없다. 배낭에 넣을 수 없기 때문이며,

j--로 뒤에서부터 반복하는것은 같은 물건을 중복해서 쓰는걸 방지하기 위해서이다.

 

w = 현재 물건의 무게, v = 현재 물건의 가치

dp[j] = 무게 j일 때 최대 가치를 저장, dp[j -w] + v = 이 물건을 넣었을 경우 새로 얻을 수 있는 가치 

max 함수를 통해 이전 상태 dp[j -w]를 이용하여 현재 상태 dp[j]를 갱신하며 효율적으로 접근한다.

728x90

'백준 C++' 카테고리의 다른 글

백준 14502 연구소 C++  (0) 2025.05.20
백준 1149번 RGB거리 C++  (0) 2025.05.19
백준 9095번 1,2,3 더하기 C++  (0) 2025.05.18
백준 14890 경사로 C++  (0) 2025.05.11
백준 14503번 로봇 청소기 C++  (0) 2025.05.06