μƒˆμ†Œμ‹

λ°˜μ‘ν˜•
Algorithm

λ°±μ€€ 1106 ν˜Έν…”[JAVA]

  • -
λ°˜μ‘ν˜•

세계적인 ν˜Έν…”μΈ ν˜•νƒ ν˜Έν…”μ˜ 사μž₯인 κΉ€ν˜•νƒμ€ μ΄λ²ˆμ— μˆ˜μž…μ„ 쑰금 늘리기 μœ„ν•΄μ„œ 홍보λ₯Ό ν•˜λ €κ³  ν•œλ‹€.

ν˜•νƒμ΄κ°€ 홍보λ₯Ό ν•  수 μžˆλŠ” λ„μ‹œκ°€ μ£Όμ–΄μ§€κ³ , 각 λ„μ‹œλ³„λ‘œ ν™λ³΄ν•˜λŠ”λ° λ“œλŠ” λΉ„μš©κ³Ό, κ·Έ λ•Œ λͺ‡ λͺ…μ˜ ν˜Έν…” 고객이 λŠ˜μ–΄λ‚˜λŠ”μ§€μ— λŒ€ν•œ 정보가 μžˆλ‹€.

예λ₯Ό λ“€μ–΄, “μ–΄λ–€ λ„μ‹œμ—μ„œ 9원을 λ“€μ—¬μ„œ ν™λ³΄ν•˜λ©΄ 3λͺ…μ˜ 고객이 λŠ˜μ–΄λ‚œλ‹€.”와 같은 정보이닀. μ΄λ•Œ, μ΄λŸ¬ν•œ 정보에 λ‚˜νƒ€λ‚œ λˆμ— μ •μˆ˜λ°° λ§ŒνΌμ„ νˆ¬μžν•  수 μžˆλ‹€. 즉, 9원을 λ“€μ—¬μ„œ 3λͺ…μ˜ 고객, 18원을 λ“€μ—¬μ„œ 6λͺ…μ˜ 고객, 27원을 λ“€μ—¬μ„œ 9λͺ…μ˜ 고객을 λŠ˜μ–΄λ‚˜κ²Œ ν•  수 μžˆμ§€λ§Œ, 3원을 λ“€μ—¬μ„œ ν™λ³΄ν•΄μ„œ 1λͺ…μ˜ 고객, 12원을 λ“€μ—¬μ„œ 4λͺ…μ˜ 고객을 λŠ˜μ–΄λ‚˜κ²Œ ν•  μˆ˜λŠ” μ—†λ‹€.

각 λ„μ‹œμ—λŠ” λ¬΄ν•œ λͺ…μ˜ 잠재적인 고객이 μžˆλ‹€. μ΄λ•Œ, ν˜Έν…”μ˜ 고객을 적어도 Cλͺ… 늘이기 μœ„ν•΄ ν˜•νƒμ΄κ°€ νˆ¬μžν•΄μ•Ό ν•˜λŠ” 돈의 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 C와 ν˜•νƒμ΄κ°€ 홍보할 수 μžˆλŠ” λ„μ‹œμ˜ 개수 N이 μ£Όμ–΄μ§„λ‹€. CλŠ” 1,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄κ³ , N은 20보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 λ„μ‹œμ—μ„œ 홍보할 λ•Œ λŒ€λŠ” λΉ„μš©κ³Ό κ·Έ λΉ„μš©μœΌλ‘œ 얻을 수 μžˆλŠ” 고객의 μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 이 값은 100보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 문제의 정닡을 좜λ ₯ν•œλ‹€.


νˆ¬μžν•˜λŠ” 돈의 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” 문제인데, dp둜 μ ‘κ·Όν•΄ λ³΄μ•˜λ‹€. 1λͺ…일 λ•Œ, κ°€μž₯ μž‘μ€ 돈이 λ“œλŠ” 경우, 2원일 λ•Œ, (1λͺ…일 λ•Œ + 1μ›μ§œλ¦¬ κ°€μž₯ μž‘μ€ 돈이 λ“œλŠ” 경우) 와 (2λͺ… 이상인 경우 쀑 κ°€μž₯ μž‘μ€ 돈이 λ“œλŠ” 경우), 3원일 λ•Œ, 4원일 λ•Œ... 계속 λ°˜λ³΅ν•˜μ—¬ μ ‘κ·Όμ‹œν‚¬ 수 μžˆμ—ˆλ‹€. 100μ›μΌλ•Œ 10λͺ… 4λͺ… 2λͺ… 있으면 (90λͺ…μΌλ•Œ μ΅œμ†Œ + 10λͺ…), (96λͺ…μΌλ•Œ μ΅œμ†Œ + 4λͺ…), (98λͺ…μΌλ•Œ μ΅œμ†Œ + 2λͺ…) 쀑 κ°€μž₯ μž‘μ€ 값을 κ³ λ₯΄λ©΄ μ΅œμ†Ÿκ°’μ΄ 될 것이닀. 이와 같은 κ·œμΉ™μœΌλ‘œ μ§„ν–‰ν•΄λ΄€λ‹€


1. λ³€μˆ˜ 선언은 μ•„λž˜ μ½”λ“œμ™€ 같이 ν•˜μ˜€λ‹€. cost와 peson을 κ°€μ§„ 객체λ₯Ό μƒμ„±ν–ˆκ³  ν•΄λ‹Ή 객체λ₯Ό λ¦¬μŠ€νŠΈλ‘œκ°€μ§„ λ„μ‹œ 배열을 μ„ μ–Έν–ˆλ‹€.

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static MarketingCost[] city;
    static int result = 987654321;
    static int[] array;
    static int N, C;
    
    class MarketingCost {
    int cost;
    int person;

    public MarketingCost(int cost, int person) {
        this.cost = cost;
        this.person = person;
    }
}

 2.dp값을 μ €μž₯ν•˜λŠ” array값을 μ΅œλŒ“κ°’μ΄ λ„˜λŠ” κ°’μœΌλ‘œ 섀정을 ν•΄μ£Όκ³  0인덱슀λ₯Ό 0으둜 μ„€μ •ν•΄μ£Όμ—ˆλ‹€. κ³„μ‚°ν•˜λ‹€ μΈλ±μŠ€κ°€ -κ°€ 될경우 인덱슀λ₯Ό 0으둜 λ°”κΏ”μ£Όκ³  0을 λ°˜ν™˜ν•˜κΈ° μœ„ν•¨μ΄μ˜€λ‹€.(λ§Œμ•½ -1λͺ…μ΄λ˜ -2λͺ…μ΄λ˜ λ“œλŠ” λΉ„μš©μ€ 0μ΄λ‹ˆκΉ)  이후 값듀을 μ €μž₯ν•΄μ€€λ‹€.

        city = new MarketingCost[C];
        array = new int[1101];
        Arrays.fill(array, 987654321);
        array[0] = 0;

        for (int i = 0; i < C; i++) {
            st = new StringTokenizer(br.readLine());
            city[i] = new MarketingCost(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
        }

3.이후 μ²˜μŒμ— μ„€λͺ…ν–ˆλ˜λŒ€λ‘œ 천천히 전체 경우의 수λ₯Ό λ”°μ Έκ°€λ©°, 배열을 μ±„μš΄λ‹€. 

        for (int i = 1; i <= N; i++) {
            for (MarketingCost m : city) {
                int index = 0;
                if (i - m.person < 0){
                    index = 0;
                }else{
                    index = i - m.person;
                }

                array[i] = Math.min(array[index] + m.cost, array[i]);
            }
        }

        for (int i = N; i <= N; i++) {
            result = Math.min(result, array[i]);
        }

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static MarketingCost[] city;
    static int result = 987654321;
    static int[] array;
    static int N, C;

    public static void main(String[] args) throws IOException {

        br = new BufferedReader(new InputStreamReader(System.in));

        st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());

        city = new MarketingCost[C];
        array = new int[1101];
        Arrays.fill(array, 987654321);
        array[0] = 0;

        for (int i = 0; i < C; i++) {
            st = new StringTokenizer(br.readLine());
            city[i] = new MarketingCost(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
        }

        for (int i = 1; i <= N; i++) {
            for (MarketingCost m : city) {
                int index = 0;
                if (i - m.person < 0){
                    index = 0;
                }else{
                    index = i - m.person;
                }

                array[i] = Math.min(array[index] + m.cost, array[i]);
            }
        }

        for (int i = N; i <= N; i++) {
            result = Math.min(result, array[i]);
        }

        System.out.println(result);
    }

}

class MarketingCost {
    int cost;
    int person;

    public MarketingCost(int cost, int person) {
        this.cost = cost;
        this.person = person;
    }
}

 

κ°„λ‹¨ν•œ dpλ¬Έμ œμ—¬μ„œ μ‰½κ²Œ μ§„ν–‰ν–ˆλ˜ 것 κ°™λ‹€.

λ°˜μ‘ν˜•
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.