๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/7579
โธ ๋ฌธ์
์ฐ๋ฆฌ๋ ์ค๋งํธํฐ์ ์ฌ์ฉํ๋ฉด์ ์ฌ๋ฌ ๊ฐ์ง ์ฑ(App)์ ์คํํ๊ฒ ๋๋ค. ๋๊ฐ์ ๊ฒฝ์ฐ ํ๋ฉด์ ๋ณด์ด๋ ‘์คํ ์ค’์ธ ์ฑ์ ํ๋๋ฟ์ด์ง๋ง ๋ณด์ด์ง ์๋ ์ํ๋ก ๋ง์ ์ฑ์ด 'ํ์ฑํ'๋์ด ์๋ค. ์ฑ๋ค์ด ํ์ฑํ ๋์ด ์๋ค๋ ๊ฒ์ ํ๋ฉด์ ๋ณด์ด์ง ์๋๋ผ๋ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ์ํ๊ฐ ๊ธฐ๋ก๋์ด ์๋ ๊ฒ์ ๋งํ๋ค. ํ์ฌ ์คํ ์ค์ด ์๋๋๋ผ๋ ์ด๋ ๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊ฒจ๋๋ ์ด์ ๋ ์ฌ์ฉ์๊ฐ ์ด์ ์ ์คํํ๋ ์ฑ์ ๋ค์ ๋ถ๋ฌ์ฌ ๋์ ์ง์ ์ ์ํ๋ฅผ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ์ฝ์ด ๋ค์ฌ ์คํ ์ค๋น๋ฅผ ๋น ๋ฅด๊ฒ ๋ง์น๊ธฐ ์ํด์์ด๋ค.
ํ์ง๋ง ์ค๋งํธํฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ด๋ผ๋ ์คํํ๋ ๋ชจ๋ ์ฑ์ ํ์ฑํ๋ ์ฑ๋ก ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊ฒจ๋๋ค ๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ํ๊ฐ ์ค๊ธฐ ์ฝ๋ค. ์๋ก์ด ์ฑ์ ์คํ์ํค๊ธฐ ์ํด ํ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ์ค๋งํธํฐ์ ์ด์์ฒด์ ๋ ํ์ฑํ ๋์ด ์๋ ์ฑ๋ค ์ค ๋ช ๊ฐ๋ฅผ ์ ํํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ์ญ์ ํ๋ ์๋ฐ์ ์๋ค. ์ด๋ฌํ ๊ณผ์ ์ ์ฑ์ ‘๋นํ์ฑํ’๋ผ๊ณ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ํฉ์์ ํ์ฑํ ๋์ด ์๋ ์ฑ๋ค์ ๋ฌด์์๋ก ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋งํผ ๋นํ์ฑํ ํ๋ ๊ฒ์ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค. ๋นํ์ฑํ๋ ์ฑ๋ค์ ์ฌ์คํํ ๊ฒฝ์ฐ ๊ทธ๋งํผ ์๊ฐ์ด ๋ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฌ๋ฌ๋ถ์ ์ด๋ฌํ ์ฑ์ ๋นํ์ฑํ ๋ฌธ์ ๋ฅผ ์ค๋งํธํ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ผ ํ๋ค
ํ์ฌ N๊ฐ์ ์ฑ, A1, ..., AN์ด ํ์ฑํ ๋์ด ์๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ค ์ฑ Ai๋ ๊ฐ๊ฐ mi ๋ฐ์ดํธ๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ๋ํ, ์ฑ Ai๋ฅผ ๋นํ์ฑํํ ํ์ ๋ค์ ์คํํ๊ณ ์ ํ ๊ฒฝ์ฐ, ์ถ๊ฐ์ ์ผ๋ก ๋ค์ด๊ฐ๋ ๋น์ฉ(์๊ฐ ๋ฑ)์ ์์นํ ํ ๊ฒ์ ci ๋ผ๊ณ ํ์. ์ด๋ฌํ ์ํฉ์์ ์ฌ์ฉ์๊ฐ ์๋ก์ด ์ฑ B๋ฅผ ์คํํ๊ณ ์ ํ์ฌ, ์ถ๊ฐ๋ก M ๋ฐ์ดํธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ํ์. ์ฆ, ํ์ฌ ํ์ฑํ ๋์ด ์๋ ์ฑ A1, ..., AN ์ค์์ ๋ช ๊ฐ๋ฅผ ๋นํ์ฑํ ํ์ฌ M ๋ฐ์ดํธ ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ํ๋ณดํด์ผ ํ๋ ๊ฒ์ด๋ค. ์ฌ๋ฌ๋ถ์ ๊ทธ ์ค์์ ๋นํ์ฑํ ํ์ ๊ฒฝ์ฐ์ ๋น์ฉ ci์ ํฉ์ ์ต์ํํ์ฌ ํ์ํ ๋ฉ๋ชจ๋ฆฌ M ๋ฐ์ดํธ๋ฅผ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
โธ ์ ๋ ฅ
์ ๋ ฅ์ 3์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฒซ ์ค์๋ ์ ์ N๊ณผ M์ด ๊ณต๋ฐฑ๋ฌธ์๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ฉฐ, ๋์งธ ์ค๊ณผ ์ ์งธ ์ค์๋ ๊ฐ๊ฐ N๊ฐ์ ์ ์๊ฐ ๊ณต๋ฐฑ๋ฌธ์๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์ N๊ฐ์ ์ ์๋ ํ์ฌ ํ์ฑํ ๋์ด ์๋ ์ฑ A1, ..., AN์ด ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํธ ์์ธ m1, ..., mN์ ์๋ฏธํ๋ฉฐ, ์ ์งธ ์ค์ ์ ์๋ ๊ฐ ์ฑ์ ๋นํ์ฑํ ํ์ ๊ฒฝ์ฐ์ ๋น์ฉ c1, ..., cN์ ์๋ฏธํ๋ค
๋จ, 1 ≤ N ≤ 100, 1 ≤ M ≤ 10,000,000์ด๋ฉฐ, 1 ≤ m1, ..., mN ≤ 10,000,000์ ๋ง์กฑํ๋ค. ๋ํ, 0 ≤ c1, ..., cN ≤ 100์ด๊ณ , M ≤ m1 + m2 + ... + mN์ด๋ค.
โธ ์ถ๋ ฅ
ํ์ํ ๋ฉ๋ชจ๋ฆฌ M ๋ฐ์ดํธ๋ฅผ ํ๋ณดํ๊ธฐ ์ํ ์ฑ ๋นํ์ฑํ์ ์ต์์ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ํ ์ค์ ์ถ๋ ฅํด์ผ ํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 3
- ๐ ๋ฌธ์ ์ ํ : ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, ๋ฐฐ๋ญ ๋ฌธ์
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์ด ๋ฌธ์ ๋ Knapsack(๋ฐฐ๋ญ) ๋ฌธ์ ์ ์ ์ฌํ ํํ๋ก, ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํด ํด๊ฒฐํ ์ ์๋ค.
๐ DP ๋ฐฐ์ด ์ ์
dp[i][j] : i๋ฒ์งธ ์ฑ๊น์ง ๊ณ ๋ คํ์ ๋, ๋น์ฉ j๋ก ํ๋ณด ๊ฐ๋ฅํ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ
cost[i] : i๋ฒ์งธ ์ฑ์ ๋นํ์ฑํ ๋น์ฉ
memory[i] : i๋ฒ์งธ ์ฑ์ด ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ
๐ DP ํ ์ด๋ธ ์ด๊ธฐ ์ํ
๋น์ฉ(j) | 0 | 1 | 2 | 3 | ... |
dp[0][j] | 0 | 0 | 0 | 30 | ... |
dp[0][0] = 0 → 0๋ฒ์งธ ์ฑ๊น์ง ๊ณ ๋ คํ์ ๋, ๋น์ฉ 0์ผ๋ก ํ๋ณด ๊ฐ๋ฅํ ์ต๋ ๋ฉ๋ชจ๋ฆฌ๋ 0
dp[0][3] = 30 → 0๋ฒ์งธ ์ฑ์ ๋นํ์ฑํํ๋ฉด ๋น์ฉ 3์ผ๋ก ํ๋ณดํ ์ ์๋ ์ต๋ ๋ฉ๋ชจ๋ฆฌ๋ 30
๋น์ฉ j๊ฐ cost[0] ์ด์์ด์ด์ผ ์ ํ ๊ฐ๋ฅ (์ฆ, j >= cost[0])
๐ DP ์ ํ์ ์ธ์ฐ๊ธฐ
i๋ฒ์งธ ์ฑ์ ๊ณ ๋ คํ์ ๋, ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋๋ค.
1๏ธโฃ ํ์ฌ ์ฑ์ ๋นํ์ฑํํ์ง ์๋ ๊ฒฝ์ฐ
์ด์ ๊น์ง์ ์ต์ ํด๋ฅผ ๊ทธ๋๋ก ์ ์ง
dp[i][j] = dp[i-1][j]
2๏ธโฃ ํ์ฌ ์ฑ์ ๋นํ์ฑํํ๋ ๊ฒฝ์ฐ (j >= cost[i])
(j - cost[i]) ๋น์ฉ์ ์ฌ์ฉํ ์ํ์์, ํ์ฌ ์ฑ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐ
dp[i][j] = dp[i-1][j-cost[i]] + memory[i]
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ๊ฒฝ์ฐ ์ค ๋ ํฐ ๊ฐ์ ์ ํํ๋ค.
dp[i][j] = max(dp[i−1][j], dp[i−1][j−cost[i]]+memory[i])
๐ ์ต์ ๋น์ฉ ์ฐพ๊ธฐ
dp[i][j]์๋ ๋น์ฉ j๋ฅผ ์ฌ์ฉํด์ ํ๋ณดํ ์ ์๋ ์ต๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ฅ๋๋ค.
๋ง์ฝ dp[i][j]๊ฐ k(ํ๋ณดํด์ผ ํ ์ต์ ๋ฉ๋ชจ๋ฆฌ) ์ด์์ด๋ผ๋ฉด ๋น์ฉ j๋ก M ๋ฐ์ดํธ ์ด์ ํ๋ณดํ ์ ์๋ค.
๋ฐ๋ผ์ ์ต์ ๋น์ฉ์ ์ฐพ๊ธฐ ์ํด, ans = Math.min(ans, j)๋ฅผ ํตํด j๊ฐ ์ต์ ๋น์ฉ์ธ ๊ฒฝ์ฐ๋ฅผ ๊ฐฑ์ ํ๋ค.
์ ํ์ด๋ฅผ ์ฝ๋๋ก ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 16352KB
์๊ฐ : 116ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // ์ฑ์ ๊ฐ์
int k = Integer.parseInt(st.nextToken()); // ํ์ํ ๋ฉ๋ชจ๋ฆฌ
int[] m = new int[n]; // ๊ฐ ์ฑ์ด ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
m[i] = Integer.parseInt(st.nextToken());
}
int[] c = new int[n]; // ๊ฐ ์ฑ์ ๋นํ์ฑํ ํ์ ๊ฒฝ์ฐ์ ๋น์ฉ
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
c[i] = Integer.parseInt(st.nextToken());
}
// dp[i][j] : i๋ฒ์งธ ์ฑ๊น์ง์ ๋ํ์ฌ ๋น์ฉ j๋ก ํ๋ณด ๊ฐ๋ฅํ ์ต๋ ๋ฉ๋ชจ๋ฆฌ
int[][] dp = new int[n][10001];
int ans = Integer.MAX_VALUE; // ์ต์ ๋น์ฉ
for (int i = 0; i < n; i++) {
int cost = c[i];
int memory = m[i];
for (int j = 0; j < 10001; j++) {
if (i == 0) {
if (j >= cost) dp[i][j] = memory;
} else {
if (j >= cost) {
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-cost]+memory);
} else {
dp[i][j] = dp[i-1][j];
}
}
if (dp[i][j] >= k) {
ans = Math.min(ans, j);
}
}
}
System.out.println(ans);
br.close();
}
}
ํด๊ฒฐ ์๋ฃ ! ๐ฅ
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_17485] ์ง์ฐ์ ๋ฌ ์ฌํ (Large) (0) | 2025.04.24 |
---|---|
[Boj_15980] ๋ช ์ ๋ฐฉํด๊พผ (0) | 2025.04.16 |
[Boj_1577] ๋๋ก์ ๊ฐ์ (0) | 2025.03.19 |
[Boj_19542] ์ ๋จ์ง ๋๋ฆฌ๊ธฐ (0) | 2025.03.17 |
[Boj_1937] ์์ฌ์์ด ํ๋ค (0) | 2025.03.04 |