๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/2624
๐ ๋ฌธ์ ์์ฝ
- ๋ชฉํ ๊ธ์ก n์ ๋ง๋ค๊ธฐ ์ํด k๊ฐ์ง ์ข ๋ฅ์ ๋์ ์ด ์ฃผ์ด์ง๋ค.
- ๊ฐ ๋์ ์ ๊ฐ์ ์ ํ์ด ์์.
- ์ฃผ์ด์ง ๋์ ์ ์ฌ์ฉํ์ฌ ๋ชฉํ ๊ธ์ก์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
๐ ํ์ด ๋ฐ ์๊ณ ๋ฆฌ์ฆ
1๏ธโฃ DP(๋์ ๊ณํ๋ฒ) ํ์ฉ
- dp[i] : i์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์
- ๋ฐฐ๋ญ ๋ฌธ์ ์ ๋น์ทํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋์ ์ ๊ฐ์ ์ ํ์ ๊ณ ๋ ค
2๏ธโฃ ์ ํ์ ์ ๋
- ๊ธฐ๋ณธ์ ์ธ ๋์ ๋ฌธ์ ๋ ๊ฐ์ ์ ํ ์์ด ๋ฌดํํ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ
→ dp[j] += dp[j - amount] - ๊ทธ๋ฌ๋ ์ด ๋ฌธ์ ๋ ๊ฐ์ ์ ํ์ด ์กด์ฌ
→ s๊ฐ์ ๋์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ผ ํจ
for (int s = 1; s <= cnt; s++) {
if (j - s * amount < 0) break; // ๊ธ์ก ์ด๊ณผ์ ์ข
๋ฃ!
dp[j] += dp[j - s * amount];
}
- dp[j]๋ ํ์ฌ ๊ธ์ก j๋ฅผ ๋ง๋ค๊ธฐ ์ํด s๊ฐ์ ๋์ ์ ์ฌ์ฉํ์ ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋์
๐ก ์ฝ๋
public class Baekjoon_2624 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // ๋ชฉํ ๊ธ์ก
int k = sc.nextInt(); // ๋์ ์ข
๋ฅ์
int[] dp = new int[n + 1];
dp[0] = 1;
for (int i = 0; i < k; i++) {
int amount = sc.nextInt(); // ๋์ ๊ฐ์น
int cnt = sc.nextInt(); // ๋์ ๊ฐ์
for (int j = n; j >= 0; j--) { // ํฐ ๊ธ์ก๋ถํฐ ์ฒ๋ฆฌ
for (int s = 1; s <= cnt; s++) {
if (j + s * amount > n) { // ๊ธ์ก ์ด๊ณผ ์ ์ข
๋ฃ
break;
}
dp[j + s * amount] += dp[j];
}
}
}
System.out.println(dp[n]);
}
}
๐ ์๊ฐ ๋ณต์ก๋ ๋ถ์
- k๊ฐ์ ๋์ ์ ํ์ (O(K))
- ๊ฐ ๋์ ์ ๋ํด n์์ ๋ง๋ค๊ธฐ ์ํ ๋ฐ๋ณต๋ฌธ (O(N))
- ๊ฐ์ ์ ํ(cnt)์ ๊ณ ๋ คํ ๋ด๋ถ ๋ฐ๋ณต๋ฌธ (O(C))
- ์ด ์๊ฐ ๋ณต์ก๋: O(K * N * C) (C: ๋์ ๊ฐ์ ์ ํ)
- N ≤ 10,000, K ≤ 100, C <=1000์ด๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ O(K * N * C) = O(1,000,000,000) ์ด์ง๋ง, break๋ก ์ต์ ํํ๊ธฐ ๋๋ฌธ์ ํต๊ณผ
'์๊ณ ๋ฆฌ์ฆ(JAVA)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 10844 "์ฌ์ด ๊ณ๋จ ์" (JAVA) (0) | 2025.03.04 |
---|---|
๋ฐฑ์ค 10451 "ํ ํ๋ก์ ํธ" (JAVA) (0) | 2025.02.26 |
๋ฐฑ์ค 10451 "์์ด ์ฌ์ดํด" (JAVA) (0) | 2025.02.26 |
๋ฐฑ์ค 1194 "๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์" (JAVA) (0) | 2025.02.26 |
๋ฐฑ์ค 2206 "๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ" (JAVA) (0) | 2025.02.22 |