[백준] 평범한 배낭
[DP] 평범한 배낭
문제
준서는 여행을 배낭을 최대한 가치 있게 싸려고 한다.
준서가 여행에 필요하다고 생각하는 N개의 물건이 있다. 각 물건은 무게 W와 가치 V를 가지는데, 해당 물건을 배낭에 넣어서 가면 준서가 V만큼 즐길 수 있다. 준서는 최대 K만큼의 무게만을 넣을 수 있는 배낭만 들고 다닐 수 있다. 준서가 최대한 즐거운 여행을 하기 위해 배낭에 넣을 수 있는 물건들의 가치의 최댓값을 알려주자.
입출력 예
입력 :
4 7
6 13
4 8
3 6
5 12
출력 :
14
풀이
DP
문제, bag[n][k]
= n번까지의 물건들 중 최적으로 고른 물건들(무게 합이 k 이하이면서 가치 합이 최대)의 가치 합
- n번 물건의 무게가 배낭의 무게 한도보다 무거워 넣을 수 없을 때:
이전 값(n번째 물건 넣기 전의 최적 가치 합)
bag[n][k] = bag[n-1][k]
-
넣을 수 있을 때: n번째 물건의 무게
w
, 가치v
(이전 값, w만큼 담지못한 이전 값에 n번째 물건 담았을 때 가치 합) 중 큰 것bag[n][k] = Math.max(bag[n-1][k], bag[n-1][k-w] + v)
let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split("\n");
const N = Number(input[0].split(" ")[0]);
const K = Number(input[0].split(" ")[1]);
input = input.map((el) =>
el
.trim()
.split(" ")
.map((value) => Number(value))
);
const bag = Array.from(new Array(N + 1), () => new Array(K + 1).fill(0));
for (let j = 1; j <= K; j++) {
if (input[1][0] <= j) {
bag[1][j] = input[1][1];
} else {
bag[1][j] = 0;
}
}
for (let i = 2; i <= N; i++) {
for (let j = 1; j <= K; j++) {
let [w, v] = input[i];
if (j < w) {
bag[i][j] = bag[i - 1][j];
} else {
bag[i][j] = Math.max(bag[i - 1][j], bag[i - 1][j - w] + v);
}
}
}
console.log(bag[N][K]);