2023. 12. 6. 14:08ใ์ธํ๋ฐ/์๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์ ๋ฌธ : ์ฝ๋ฉํ ์คํธ ๋๋น
https://hyejin.tistory.com/1276
-> ์ด์ ๋ฌธ์ ํ์ด
3. ์ต๋์ ์ ๊ตฌํ๊ธฐ
์ค๋ช
์ด๋ฒ ์ ๋ณด์ฌ๋ฆผํผ์๋๋ํ์์ ์ข์ ์ฑ์ ์ ๋ด๊ธฐ ์ํ์ฌ ํ์๋ ์ ์๋์ด ์ฃผ์ N๊ฐ์ ๋ฌธ์ ๋ฅผ ํ๋ ค๊ณ ํฉ๋๋ค.
๊ฐ ๋ฌธ์ ๋ ๊ทธ๊ฒ์ ํ์์ ๋ ์ป๋ ์ ์์ ํธ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ์ฃผ์ด์ง๊ฒ ๋ฉ๋๋ค.
์ ํ์๊ฐ M์์ N๊ฐ์ ๋ฌธ์ ์ค ์ต๋์ ์๋ฅผ ์ป์ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค.
(ํด๋น๋ฌธ์ ๋ ํด๋น์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฉด ํธ๋ ๊ฑธ๋ก ๊ฐ์ฃผํ๋ค, ํ ์ ํ๋น ํ๊ฐ๋ง ํ ์ ์์ต๋๋ค.)
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ๋ฌธ์ ์ ๊ฐ์N(1<=N<=20)๊ณผ ์ ํ ์๊ฐ M(10<=M<=300)์ด ์ฃผ์ด์ง๋๋ค.
๋ ๋ฒ์งธ ์ค๋ถํฐ N์ค์ ๊ฑธ์ณ ๋ฌธ์ ๋ฅผ ํ์์ ๋์ ์ ์์ ํธ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ์ฃผ์ด์ง๋๋ค.
์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ์ ํ ์๊ฐ์์ ์ป์ ์ ์๋ ์ต๋ ์ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์์ ์ ๋ ฅ 1
5 20
10 5
25 12
15 8
6 3
7 4
์์ ์ถ๋ ฅ 1
41
๋ฌธ์ ํ์ด 1
public class GetMaximumScore
{
static int n, m, max;
static int[] score, times;
public void DFS(int L, int time, int sum)
{
if (time > m) {
return;
}
if (L == n) {
if (sum > max) max = sum;
}else {
DFS(L + 1, time + times[L], sum + score[L]);
DFS(L + 1, time, sum);
}
}
public static void main(String[] args)
{
GetMaximumScore getMaximumScore = new GetMaximumScore();
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
score = new int[n];
times = new int[n];
for (int i = 0; i < n; i++)
{
score[i] = scanner.nextInt();
times[i] = scanner.nextInt();
}
getMaximumScore.DFS(0, 0, 0);
System.out.println(max);
}
}
๐ฉ๐ป๐ป : ์ด ๋ฌธ์ ๋ ํฉ์ด ๊ฐ์ ๋ถ๋ถ์งํฉ, ๋ฐ๋์ด ์น์ฐจ ๊ณผ ๊ฐ์ด ๋ถ๋ถ ์งํฉ ํ์ด ๋ฐฉ์์ผ๋ก ํ์ด์ฃผ๋ฉด ๋๋ค. (๋ฌธ์ ํ์ด ๋ฐฉ์์ด ์์ ๊ฐ์)
๋์ ์ด ๋ฌธ์ ์์๋ ์ ์์ ์๊ฐ์ด ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง ์ต๋ ์๊ฐ์ ๋๊ธฐ์ง ์์ผ๋ฉด์ ์ต๋ ํฉ์ ๊ตฌํ๋ฉด ๋๋ค.
๋ฐ๋ผ์ score, time ๊ฐ๊ฐ 1์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ฃผ๊ณ , ๊ทธ ๋ค์์๋ ๋น์ทํ๊ฒ ๋ฌธ์ ๋ฅผ ํ๋ฉด ๋๋ค.
๋ฌธ์ ๋ฅผ ํ๊ณ , ์ํ๊ณ ์ ๋ฐ๋ผ์ ๋ฌธ์ ๋ฅผ ํผ๋ค๊ณ ์๊ฐํ๋ฉด sum์ score[L]์ ๋ํ๋ฉด์ time์ times[L]์ ๋ํด์ฃผ๊ฑฐ๋,
๋ฌธ์ ๋ฅผ ํ์ง ์์ ๋๋ ๊ทธ๋ฅ sum๊ณผ time ๊ฐ์ ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
L์ด n๊น์ง ๊ฐ์ ๋๋ max๊ฐ sum๋ณด๋ค ์์ ๊ฒฝ์ฐ sum์ ๊ฐ์ max์ ๋์ ํด์ฃผ๊ณ ๋ฐํํ๋ฉด ๋๋ค.
๋๋ time์ด m๋ณด๋ค ์ปค์ง ๊ฒฝ์ฐ์๋ ์ฃผ์ด์ง ์๊ฐ์์ ๋ฌธ์ ๋ฅผ ํ์ง ๋ชปํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ return ํด์ฃผ๋ฉด ๋๋ค.
๋ฌธ์ ํ์ด 2
public class GetMaximumScore2 {
static int answer = Integer.MIN_VALUE, n, m;
boolean flag = false;
// ps : score, pt : time
public void DFS(int L, int sum, int time, int[] ps, int[] pt) {
if (time > m) return;
if (L == n) {
answer = Math.max(answer, sum);
}else {
DFS(L + 1, sum + ps[L], time + pt[L], ps, pt); // ๋ฌธ์ ๋ฅผ ํ ๋
DFS(L + 1, sum, time, ps, pt); // ๋ฌธ์ ๋ฅผ ํ์ง ์์ ๋
}
}
public static void main(String[] args) {
GetMaximumScore2 getMaximumScore2 = new GetMaximumScore2();
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
int[] a = new int[n];
int[] b = new int[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextInt();
b[i] = scanner.nextInt();
}
getMaximumScore2.DFS(0, 0, 0, a, b);
System.out.println(answer);
}
}
๐พ : ๊ฐ์ฌ๋๋ ๋น์ทํ๊ฒ ํ์ จ๋๋ฐ, ๊ฐ์ฌ๋์ DFS ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก ์ ์์ ์๊ฐ ๋ฐฐ์ด๋ ํจ๊ป ๋๊ฒจ์ฃผ๊ณ ์๋ค.
ps๋ ์ ์ ๋ฐฐ์ด์ ์๋ฏธํ๊ณ , pt๋ ์๊ฐ ๋ฐฐ์ด์ ์๋ฏธํ๋ค.
๋ฌธ์ ๋ฅผ ํ ๋๋
DFS(L + 1, sum + ps[L], time + pt[L], ps, pt); // ๋ฌธ์ ๋ฅผ ํ ๋
์ด ์ฌ๊ทํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๊ณ ,
๋ฌธ์ ๋ฅผ ํ์ง ์์ ๋๋
DFS(L + 1, sum, time, ps, pt); // ๋ฌธ์ ๋ฅผ ํ์ง ์์ ๋
์ด ์ฌ๊ทํจ์๋ฅผ ํธ์ถํด์ ๊ฐ๊ฐ์ ๋ถ๋ถ์งํฉ์ ๋ง๋ค์ด ๋๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ time์ด ์ ํ๋ ์๊ฐ m ์ ๋๊ธธ ์ ์์ผ๋ฏ๋ก m๋ณด๋ค ์ปค์ง๋ฉด return ํด์ค ํจ์๋ฅผ ์ข ๋ฃํ๊ณ ,
L์ด n๊น์ง ๋จ๊ณ๊ฐ ๋ด๋ ค๊ฐ์ ๋๋ answer ์ sum ๊ฐ์ ๋น๊ตํด์ ํฐ ๊ฐ์ answer์ ๋ด์์ฃผ๋ฉด ๋๋ค.