https://www.acmicpc.net/problem/12865
โถ ์ ํ
- S๋ ์ ์ฒด ๋ฌผ๊ฑด๋ค์ ์งํฉ
- ๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๋ฅผ ๊ฐ๊ณ ์๊ณ , ๊ฐ์น๋ฅผ ๊ฐ๊ณ ์์ ๋
- ์ค์ ๋ ์ต๋ ๋ฌด๊ฒ๋ฅผ ๋์ง ์์ผ๋ฉด์ ์ต๋ ๊ฐ์น๋ฅผ ๊ฐ์ง ์ ์๋ ๋ฌผ๊ฑด ๋ถ๋ถ ์งํฉ A ⊆ S์ ๊ตฌํ๋ ๊ฒ
- ๋ฌผ๊ฑด์ ์ผ๋ถ๋ถ๋ง ๊ฐ์ ธ๊ฐ๋ฉด์ ๋ฐฐ๋ญ์ ์ฑ์ฐ๋์ง, ๋ฌด์กฐ๊ฑด ํด๋น ๋ฌผ๊ฑด ํต์ผ๋ก ์ฑ๊ฒจ์ผ ํ๋ ์ง์ ๋ฐ๋ผ์
0-1 ๋ฐฐ๋ญ, ๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์ ๋ก ์ ํ์ด ๊ฐ๋ฆฐ๋ค.
๋ถ๋ถ์งํฉ์ ๋ชจ๋ ์์ฑํด์(bruteforce) ํ ์ ๋ ์์ง๋ง ์ ์ฒด ๋ฌผ๊ฑด ์ n์ด ์ปค์ง๋ฉด ์๊ฐ๋ณต์ก๋๊ฐ ํฐ์ง ์ํ์ด ์๋ค.
=> O(2^n) // ๋ถ๋ถ ์งํฉ ์์ฑ์๋ง
n์ด 30๋ง ๋๋๋ผ๋ ์ฝ 10์ต์ด๋ผ์(leaf๋ ธ๋ ์์ฑ๋ง) ์ฌ๊ท ์คํ์ด ๋ชป๋ฒํ จ ํฐ์ ธ๋ฒ๋ฆด ๊ฒ์ด๋ค. ๊ฐ์ง์น๊ธฐ๋ฅผ ์ณ์ ์ต๋ํ ๋ฒํฐ๋๋ผ๋ ๋ ํฐ n๋ง๋๋ฉด ๋ต์ด ์๋ค.
โถ ์ ๋ต
0-1 ๋ฐฐ๋ญ ๋ฌธ์ ์ ๊ฒฝ์ฐ
์ ํ ๊ธฐ์ค์ด ๋ฌด๊ฒ, ๊ฐ์น ๋ ๊ฐ๊ฐ ์๋ค๊ณ ๊ฐ๊ฐ์ ๊ฒฝ์ฐ๋ก ๋๋๋ฉด, ์ต์ ํด๋ฅผ ๊ตฌํ ์ ์๋ค.
- ๋ฌด๊ฒ ๊ธฐ์ค์ผ๋ก ๊ฐ๋ฒผ์ด ๊ฑฐ ๋ถํฐ ๋ด์ ๊ฒฝ์ฐ -> ๋ฌด๊ฑฐ์ด ๊ฒ ํ๋๊ฐ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ์๋์ ๊ฐ์น๋ฅผ ์ง๋๋ฉด ๋ฐ๋ก๊ฐ ๋๋ค.
- ๊ฐ์น ๊ธฐ์ค์ผ๋ก ๋์ ๊ฑฐ ๋ถํฐ ๋ด์ ๊ฒฝ์ฐ -> ๊ฐ์น ๋์ ๊ฑฐ ํ๋๋ฅผ ๋ด์์ ๋๋ณด๋ค, ๊ฐ์น ๋ฎ์๊ฑฐ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ด์์ ๋๊ฐ ๋ ํฉ์ฐ์ด ๋์์ง ์ ์๋ค.
- ๋ฌด๊ฒ ๋น ๊ฐ์น๊ฐ ๋์ ๊ฑฐ๋ก ์ ๋ ฌํด์ ๋ด์ ๊ฒฝ์ฐ -> ์ด ๊ฒฝ์ฐ๋ ๋ฌด๊ฑฐ์ด ๊ฒ ํ๋๊ฐ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ์๋์ ๊ฐ์น๋ฅผ ์ง๋ ๋ฒ๋ฆฌ๋ฉด ๋ฐ๋ก๋ค.
๊ฒฐ๊ตญ ๋์ ๊ณํ๋ฒ์ผ๋ก ํด๊ฒฐํด์ผ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค.
DP์ ํต์ฌ์ ์ด์ ๊ฒฝ์ฐ์ ์๊ฐ ๋ค์ ๊ฒฝ์ฐ์ ์์ ์ฌ์ฉ๋๋ค๋ ๊ฒ์ด๋ค. ์ฆ bottom-upํ์์ผ๋ก, ์ด๋ค ์ต์ ํด๋ ๊ทธ ์ด์ ๋จ๊ณ์ ์ต์ ํด๋ฅผ ํญ์ ํฌํจํ๋ค๋ ์๋ฆฌ๋ฅผ ์ด์ฉํ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ ์ ์๋ค.
์ด ๋ฐฉ๋ฒ์ ์ด์ฉํด 0-1 ๋ฐฐ๋ญ์ ๋ค์ ์ชผ๊ฐ๋ณด๋ฉด
- i๋ฒ์งธ ๋ฌผ๊ฑด์ด ๋ฐฐ๋ญ์ ํ๊ณ ๋ฌด๊ฒ๋ณด๋ค ๋ฌด๊ฑฐ์ฐ๋ฉด ->
i๋ฒ์งธ ๋ฌผ๊ฑด์ ์ ์ธํ๊ณ i-1๊ฐ์ ๋ฌผ๊ฑด๋ค์ ๊ฐ์ง๊ณ ๊ตฌํ ์ ๋จ๊ณ์ ์ต์ ๊ฐ์ ์ฌ์ฉํ๋ค.
- else ->
[i๋ฒ์งธ ๋ฌผ๊ฑด๋งํผ์ ๋ฌด๊ฒ๋ฅผ ์ถ๊ฐํ ๋์ ์ต์ ๊ฐ์ i๋ฒ์งธ ๋ฌผ๊ฑด์ ๊ฐ์น๋ฅผ ๋ํ ๊ฐ]๊ณผ
[i-1๊ฐ์ ๋ฌผ๊ฑด๋ค์ ๊ฐ์ง๊ณ ๊ตฌํ ์ ๋จ๊ณ์ ์ต์ ๊ฐ] ์ค ํฐ ๊ฒ์ ์ ํํ๋ค -> ๋ค์ต์คํธ๋ผ๋ ์กฐ๊ธ ๋น์ทํ ๊ฒ ๊ฐ๋ค
๊ทธ๋ผ ์ดํด์ผ๋ ๊ธฐ์ค์ด 2๊ฐ๋๊น 2์ฐจ์ dp๋ก ์ ๊ทผํ๋ค.
์ฆ
- ๋ง์ฝ ํ์ฌ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ ๋ฐฐ๋ญ์ ๋ฌด๊ฒ ํ๋๋ฅผ ์ด๊ณผํ๋ค๋ฉด, ํด๋น ๋ฌผ๊ฑด์ ๋ฐฐ๋ญ์ ๋ด์ ์ ์์ผ๋ฏ๋ก ์ด์ ์ํ(dp[i-1][w])๋ฅผ ๊ทธ๋๋ก ์ ์งํ๊ณ .
- ํ์ฌ ๋ฌผ๊ฑด์ ๋ฐฐ๋ญ์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ, ์ด์ ๋ฌผ๊ฑด์ ๋ด์์ ๋์ ๊ฐ์น(dp[i-1][w])์ ํ์ฌ ๋ฌผ๊ฑด์ ๋ด์์ ๋์ ๊ฐ์น
(dp[i-1][w - input[i][0]] + input[i][1])๋ฅผ ๋น๊ตํ์ฌ ๋ ํฐ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken()); // ๋ฌผํ์ ์
int k = Integer.parseInt(st.nextToken()); // ์ต๋ ๋ฌด๊ฒ
int[][] dp = new int[n + 1][k + 1]; // ์ฉ๋์ด k์ธ ๋ฐฐ๋ญ์ด๊ณ , ๊ฐ row์ ์ธ๋ฑ์ค์๋ ํด๋น ์ฉ๋์ผ ๋์ ๊ฐ์น๊ฐ์ด ๋ค์ด๊ฐ์๋ค.
int[][] input = new int[n + 1][2]; // ๊ฐ ๋ฌผ๊ฑด์ 0-๋ฌด๊ฒ, 1-๊ฐ์น
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine(), " ");
// i๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ, ๊ฐ์น
int weight = Integer.parseInt(st.nextToken());
int value = Integer.parseInt(st.nextToken());
input[i][0] = weight;
input[i][1] = value;
}
// ํ๋ฒํ ๋ฐฐ๋ญ
for (int i = 1; i <= n; i++) {
// N๊ฐ์ ๋ฐฐ๋ญ
for (int w = 1; w <= k; w++) { // ์ต๋ k ๋ฌด๊ฒ๋ฅผ ๋ด์ ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค
if (input[i][0] > w) { // ๋ฌผ๊ฑด์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ๋ค
// ์ด ๊ฒฝ์ฐ ๊ทธ๋ฅ ์ด์ ๋ฌผ๊ฑด์ ๋ด์ ์ํ๋ฅผ ๋ฃ์ด์ค๋ค(๋ฌผ๊ฑด ์ ๋ด์ ๊ฑฐ๋๊น)
dp[i][w] = dp[i - 1][w]; // ๋ฌด๊ฒ๊ฐ ๋ค์ด๊ฐ๋๊ฒ ์๋๋ผ ๊ฐ์น๊ฐ ๋ค์ด๊ฐ๋ค
}
else { // ๋ฌผ๊ฑด์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ๋ค
// ์ด์ ๋ฌผ๊ฑด์ ๋ด์ ์ํ๊ฐ ์ง๊ธ ๋ฌผ๊ฑด์ ๋ด์ ๊ฒฝ์ฐ์ ๋น๊ตํ์ ๋ ๋ ํฌ๋ฉด, ๋ฌผ๊ฑด์ ์๋ด๊ณ ๋์ด๊ฐ๋ค
dp[i][w] = Math.max(dp[i - 1][w], dp[i - 1][w - input[i][0]] + input[i][1]);
}
}
}
System.out.println(dp[n][k]);
}
}
dp[i][w - input[i][0]] ๋ ํ์ฌ ๋ฌผ๊ฑด์ ๋ด์ ๊ฒฝ์ฐ, ๋จ์ ๋ฐฐ๋ญ์ ๋ฌด๊ฒ๋ฅผ ๋ํ๋ธ๋ค.
์ฆ, ํ์ฌ ๋ฌผ๊ฑด์ ๋ด๋๋ค๊ณ ์ ์ ๋ฅผ ํ๊ณ , ํ์ฌ ๋ฌด๊ฒ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ด์ ๋ฌด๊ฒ index์ ๊ฐ์น๊ฐ์ด๋ ํ์ฌ ๋ฌผ๊ฑด์ ๊ฐ์น๊ฐ์ ๋ํ ๊ฐ์ ๋น๊ตํด์ max๊ฐ์ ์ ์ฅํ๋ค.
๋ฐ๋ผ์ w - input[i][0]๋ ํ์ฌ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๋ฅผ ๋ฐฐ๋ญ์ ์ด ๋ฌด๊ฒ ํ๋์์ ๋บ ๊ฐ์ผ๋ก, ํ์ฌ ๋ฌผ๊ฑด์ ๋ด์ ๋์ ๋จ์ ์ฌ์ ๊ณต๊ฐ์ ๋ํ๋ธ๋ค.
๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์ ์ ๊ฒฝ์ฐ
๋ฌด๊ฒ ๋น ๊ฐ์น๊ฐ ๋์ ๊ฑฐ๋ก ์ ๋ ฌํด์ ๋ด์ ๊ฒฝ์ฐ๊ฐ ์ต์ ํด๊ฐ ๋๋ค. <- greedy๊ฐ ํตํ๋ค.
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'OJ๐ผ > ์๊ณ ๋ฆฌ์ฆ ์ ํ ์ ๋ฆฌ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ ฌ - Comparable<T> ~ compareTo(T o1) (0) | 2024.05.29 |
---|---|
Dynamic Programming์ด ์์ธ DFSโ๏ธ - ๋ด๋ฆฌ๋ง๊ธธ, ์์ฌ์์ด ํ๋ค๐ผ (0) | 2024.04.07 |
์ ๋ ฌโ๏ธ- ์์์ ๋ ฌ (0) | 2024.04.04 |
Bruteforce๐คฎ - ์์ด, ์กฐํฉ, ๋ถ๋ถ์งํฉ (0) | 2024.03.31 |
์ต๋จ๊ฑฐ๋ฆฌ๐ - ๋ค์ต์คํธ๋ผ Dijkstra (0) | 2024.03.31 |