Publish:

νƒœκ·Έ: , ,

μΉ΄ν…Œκ³ λ¦¬:

문제 μ„€λͺ…

μ‹μž¬λ£Œ N개 μ€‘μ—μ„œ λͺ‡ 개λ₯Ό μ„ νƒν•΄μ„œ μ΄λ“€μ˜ μ˜μ–‘λΆ„(λ‹¨λ°±μ§ˆ, νƒ„μˆ˜ν™”λ¬Ό, 지방, 비타민)이 일정 이상이 λ˜μ–΄μ•Ό ν•œλ‹€. μ•„λž˜ ν‘œμ— μ œμ‹œλœ 6κ°€μ§€μ˜ μ‹μž¬λ£Œ μ€‘μ—μ„œ λͺ‡ 개λ₯Ό μ„ νƒν•΄μ„œ μ΄λ“€μ˜ μ˜μ–‘λΆ„μ˜ 각각 합이 μ΅œμ†Œ 100, 70, 90, 10κ°€ λ˜λ„λ‘ ν•˜λŠ” 경우λ₯Ό μƒκ°ν•΄λ³΄μž. 이 경우 λͺ¨λ“  재료λ₯Ό μ„ νƒν•˜λ©΄ μ‰½κ²Œ ν•΄κ²°λ˜μ§€λ§Œ, μš°λ¦¬λŠ” 쑰건을 λ§Œμ‘±μ‹œν‚€λ©΄μ„œλ„ λΉ„μš©μ΄ μ΅œμ†Œκ°€ λ˜λŠ” 선택을 ν•˜λ €κ³  ν•œλ‹€.

재료 λ‹¨λ°±μ§ˆ 지방 νƒ„μˆ˜ν™”λ¬Ό 비타민 가격
1 30 55 10 8 100
2 60 10 10 2 70
3 10 80 50 0 50
4 40 30 30 8 60
5 60 10 70 2 120
6 20 70 50 4 40

예λ₯Ό λ“€μ–΄, μ‹μž¬λ£Œ 1, 3, 5λ₯Ό μ„ νƒν•˜λ©΄ μ˜μ–‘λΆ„μ€ 100, 145, 130, 10으둜 쑰건을 λ§Œμ‘±ν•˜μ§€λ§Œ 가격은 270이 λœλ‹€. λŒ€μ‹  2, 3, 4λ₯Ό μ„ νƒν•˜λ©΄ μ˜μ–‘λΆ„μ˜ 합은 110, 130, 90, 10, λΉ„μš©μ€ 180이 λ˜λ―€λ‘œ, μ•žμ˜ λ°©λ²•λ³΄λ‹€λŠ” 더 λ‚˜μ€ 선택이 λœλ‹€.

μž…λ ₯으둜 μ‹μž¬λ£Œ ν‘œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ΅œμ € μ˜μ–‘μ†Œ 기쀀을 λ§Œμ‘±ν•˜λŠ” μ΅œμ†Œ λΉ„μš©μ˜ μ‹μž¬λ£Œ 집합을 μ°Ύμ•„μ•Ό ν•œλ‹€.

μž…λ ₯

첫 쀄에 μ‹μž¬λ£Œμ˜ 개수 N이 주어진닀.

λ‹€μŒ μ€„μ—λŠ” λ‹¨λ°±μ§ˆ, 지방, νƒ„μˆ˜ν™”λ¬Ό, λΉ„νƒ€λ―Όμ˜ μ΅œμ†Œ μ˜μ–‘μ„±λΆ„μ„ λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ mp, mf, ms, mvκ°€ 주어진닀.

μ΄μ–΄μ§€λŠ” N개의 각 μ€„μ—λŠ” i번째 μ‹μž¬λ£Œμ˜ λ‹¨λ°±μ§ˆ, 지방, νƒ„μˆ˜ν™”λ¬Ό, 비타민과 가격이 5개의 μ •μˆ˜ pi, fi, si, vi, ci와 같이 주어진닀. μ‹μž¬λ£Œμ˜ λ²ˆν˜ΈλŠ” 1λΆ€ν„° μ‹œμž‘ν•œλ‹€.

좜λ ₯

첫 번째 쀄에 μ΅œμ†Œ λΉ„μš©μ„ 좜λ ₯ν•˜κ³ , 두 번째 쀄에 쑰건을 λ§Œμ‘±ν•˜λŠ” μ΅œμ†Œ λΉ„μš© μ‹μž¬λ£Œμ˜ 번호λ₯Ό 곡백으둜 ꡬ뢄해 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ ν•œ 쀄에 좜λ ₯ν•œλ‹€. 같은 λΉ„μš©μ˜ 집합이 ν•˜λ‚˜ 이상이면 사전 순으둜 κ°€μž₯ λΉ λ₯Έ 것을 좜λ ₯ν•œλ‹€.

쑰건을 λ§Œμ‘±ν•˜λŠ” 닡이 μ—†λ‹€λ©΄ -1을 좜λ ₯ν•˜κ³ , λ‘˜μ§Έ 쀄에 아무것도 좜λ ₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

풀이

이 문제λ₯Ό ν’€κΈ° 전에 문제λ₯Ό λ¨Όμ € ν’€μ–΄λ³΄λŠ” 것을 μΆ”μ²œν•œλ‹€.

μœ„ λ¬Έμ œμ™€ 큰 틀은 κ°™λ‹€.

μ‹μž¬λ£Œλ₯Ό μ„ νƒν•˜κ±°λ‚˜ μ•ˆν•˜κ±°λ‚˜ λ‘κ°€μ§€μ˜ 경우의 μˆ˜κ°€ 있고, 각 μ‹μž¬λ£Œλ₯Ό 선택 μ‹œ λ‹€μ‹œ λ‹€μŒ μ‹μž¬λ£Œμ— λŒ€ν•΄ 두가지 경우의 수λ₯Ό νƒμƒ‰ν•˜λŠ” λ°©μ‹μ˜ dfs 둜 ν’€λ©΄λœλ‹€.

λ¬Έμ œμ™€ κ°€μž₯ 큰 차이점은 μ΅œμ†Œκ°’μ„ κ΅¬ν•˜λŠ” 것 뿐만 μ•„λ‹ˆλΌ 쑰건을 λ§Œμ‘±ν•˜λŠ” μ΅œμ†Œ λΉ„μš© μ‹μž¬λ£Œμ˜ λ²ˆν˜Έλ„ 좜λ ₯ν•΄μ•Ό ν•œλ‹€λŠ” 것이닀. 이 쑰건으둜 인해 λ°±νŠΈλž˜ν‚Ή 둜직이 ν•„μš”ν•˜λ‹€.

λ˜ν•œ, μž…λ ₯으둜 λ“€μ–΄μ˜€λŠ” κ°’μ˜ λ²”μœ„κ°€ λ‹€λ₯΄λ‹€. 이번 λ¬Έμ œμ—μ„œλŠ” β€Š0≀pi,fi,si,vi,ci≀500β€Š λΌλŠ” μ œν•œ λ²”μœ„κ°€ μžˆλŠ”λ°, λ§Œμ•½ λͺ¨λ“  μ˜μ–‘μ†Œκ°€ 0 0 0 0 0 μ΄λ ‡κ²Œ μž…λ ₯λ˜λŠ” κ²½μš°μ—λŠ” μ •λ‹΅μœΌλ‘œ μΉ΄μš΄νŠΈν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€. μ•„λž˜μ™€ 같이 μž…λ ₯λ˜λŠ” 경우 맨 첫번째 재료만 μΉ΄μš΄νŠΈν•˜κ³  dfs λ₯Ό μ’…λ£Œν•΄μ•Ό ν•œλ‹€.

1
2
3
4
5
6
7
8
9
3
0 0 0 1
0 0 0 1 1
0 0 0 0 0
0 0 0 0 0

// answer
1
1

μ‹€λ²„λ¬Έμ œ ν’€λ•Œμ™€ 같이 dfs 의 νƒˆμΆœ 쑰건을 μ•„λž˜μ²˜λŸΌ idx == N 둜 μ„€μ •ν•˜κ²Œ 되면 μœ„ μ˜ˆμ™Έ μΌ€μ΄μŠ€μ˜ 경우 μ •λ‹΅κ³Ό λ‹€λ₯Έ κ²°κ³Όκ°€ λ‚˜μ˜€κ²Œ λœλ‹€.

1
2
3
4
5
6
7
8
9
if (idx == N) { // λͺ¨λ“  λ²”μœ„ 순회 ν›„ 쑰건을 κ²€μ‚¬ν•˜λŠ” 경우 엣지 μΌ€μ΄μŠ€κΉŒμ§€ 정닡에 ν¬ν•¨μ‹œν‚¬ 수 μžˆλ‹€.
  if (p >= mp && f >= mf && s >= ms && v >= mv) {
    if (c < min) {
      min = c;
      result = new ArrayList<>(tmpResult);
    }
  }
  return;
}

μ½”λ“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.util.ArrayList;

public class Boj_19942 {
  static int N;
  static ArrayList<int[]> arr;
  static int mp, mf, ms, mv;
  static int min = Integer.MAX_VALUE;
  static ArrayList<Integer> result = new ArrayList<>();
  static ArrayList<Integer> visited = new ArrayList<>();

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    N = Integer.parseInt(br.readLine());
    arr = new ArrayList<>();

    String[] split = br.readLine().split(" ");
    mp = Integer.parseInt(split[0]);
    mf = Integer.parseInt(split[1]);
    ms = Integer.parseInt(split[2]);
    mv = Integer.parseInt(split[3]);

    for (int i = 0; i < N; i++) {
      String[] nutrient = br.readLine().split(" ");
      arr.add(new int[] {Integer.parseInt(nutrient[0]), Integer.parseInt(nutrient[1]), Integer.parseInt(nutrient[2]),
        Integer.parseInt(nutrient[3]), Integer.parseInt(nutrient[4])});
    }

    dfs(0, 0, 0, 0, 0, 0);

    if (min == Integer.MAX_VALUE) {
      System.out.println(-1);
    } else {
      System.out.println(min);
      for (Integer i : result) {
        System.out.print(i + " ");
      }
    }
  }

  private static void dfs(int idx, int p, int f, int s, int v, int c) {
    if (p >= mp && f >= mf && s >= ms && v >= mv) {  // 쑰건 λ§Œμ‘±μ‹œ λ°”λ‘œ 리턴
      if (c < min) {
        min = c;
        result = new ArrayList<>(visited);
        return;
      }
    }

    if (idx == N) {
      return;
    }

    visited.add(idx + 1);
    dfs(idx + 1, p + arr.get(idx)[0], f + arr.get(idx)[1], s + arr.get(idx)[2], v + arr.get(idx)[3], c + arr.get(idx)[4]);
    visited.remove(visited.size() - 1);  // λ°±νŠΈλž˜ν‚Ή

    dfs(idx + 1, p, f, s, v, c);
  }

}
λ°©λ¬Έν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! λŒ“κΈ€,지적,ν”Όλ“œλ°± μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€πŸ˜Š

λŒ“κΈ€λ‚¨κΈ°κΈ°