[Boj_7579] ์•ฑ

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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[i1][j], dp[i1][jcost[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();
    }
}

 

ํ•ด๊ฒฐ ์™„๋ฃŒ ! ๐Ÿ”ฅ