ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฌธ์ œ๊ฐ€ ์ดํ•ด๊ฐ€ ์•ˆ๋ผ์„œ ํ•œ 5๋ฒˆ์ •๋„ ์ฝ์Œ

๊ทธ๋‹ˆ๊นŒ ๋Œ€์ถฉ... ์ดํ•ด๊ฐ€ ๋์Œ!! 

์ผ๋‹จ ๋ฌผ๊ฑด์—๋Š” ๊ฐ๊ฐ์˜ ๊ฐ€์น˜๊ฐ€ ๋ถ€์—ฌ๊ฐ€ ๋˜๊ณ  ๊ทธ ๊ฐ€์น˜๋ฅผ ์ตœ๋Œ€ํ•œ์œผ๋กœ ํ•˜๋ฉด์„œ ๋ฐฐ๋‚ญ์— ๋ฌผ๊ฑด์„ ์ง‘์–ด๋„ฃ์–ด์•ผ ํ•จ

๊ทธ๋ ‡์ง€๋งŒ ๋ฐฐ๋‚ญ์—๋Š” ๋ฌด๊ฒŒ ์ œํ•œ์ด ์žˆ์Œ... ๋ฌผ๋ก  ๊ฐ๊ฐ ๋ฌผ๊ฑด์—๋„ ๋ฌด๊ฒŒ๊ฐ€ ์ฃผ์–ด์ง

 

[ํ’€์ด]

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ 1 ~ n ๊ฐœ์˜ ๋ฌผ๊ฑด์„ ํƒ์ƒ‰ ํ•˜๋ฉด์„œ ์ตœ๋Œ€ํ•œ ๊ฐ€์น˜๊ฐ€ ๋†’์•„์•ผ ํ•จ ๊ทผ๋ฐ ๋˜ ๋ฌด๊ฒŒ๊ฐ€ ์ดˆ๊ณผ๊ฐ€ ๋˜๋ฉด ์•ˆ๋จ

Knapsack ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž„

 

๋จผ์ € ์ฃผ์–ด์ง„ ๋ฌผ๊ฑด๋“ค์„ ์ฐจ๋ก€๋กœ w[i], v[i] ๋ฐฐ์—ด์— ์ง‘์–ด๋„ฃ์Œ

w[i] : i๋ฒˆ์งธ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ

v[i] : i๋ฒˆ์งธ ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜

๊ทธ๋ฆฌ๊ณ  2์ฐจ์› ๋ฐฐ์—ด ์ƒ์„ฑ

arr[i][j] : ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜๋งŒํผ i ์กด์žฌ, ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋งŒํผ j ์กด์žฌ

 

arr[i][j] = max(arr[i - 1][j], arr[i - 1][j - w[i]] + v[i]);

๊ทธ๊ฑธ๋กœ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑ์„ ํ•  ์ˆ˜๊ฐ€ ์žˆ์Œ

 

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ๋ฐฐ์—ด์„ ์ž‘์„ฑํ•ด ๋ณด์•˜์Œ

 

i๊ฐ€ 1์ผ๋•Œ j๊ฐ€ 6์ด ๋  ๋•Œ ์ € ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰์ด ๋จ (j >= w[i])

๊ทธ๋Œ€๋กœ ๊ฐ€์น˜๊ฐ’ 13์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋จ

๊ทธ๋ฆฌ๊ณ  j๊ฐ€ 7์ด ๋˜์–ด๋„ 13์ด ๋“ค์–ด๊ฐ

 

์ด์ œ ๋‹ค์Œ์— i๊ฐ€ 2๊ฐ€ ๋˜์—ˆ์„ ๋•Œ j๊ฐ€ 4์ผ๋•Œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰์ด ๋จ, ๊ทธ๋Œ€๋กœ ๊ฐ€์น˜๊ฐ’ 8์ด ๋“ค์–ด๊ฐ

๊ทผ๋ฐ j๊ฐ€ 6์ด ๋˜์—ˆ์„ ๋•Œ๋Š” 13์ด 8๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— arr[2][6]์—๋Š” arr[2-1][6]์ธ 13์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋จ

 

i๊ฐ€ 3์ด ๋˜์—ˆ์„ ๋•Œ 6์ด ๋“ค์–ด๊ฐ€๋‹ค๊ฐ€ 8์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ , 13์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š”๋ฐ 

arr[3][7]์—์„œ arr[3 - 1][7 - 3] ํ•ด์„œ arr[2][4]๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜๋Š”๋ฐ ์—ฌ๊ธฐ ์•ˆ์— ์›์†Œ ๊ฐ’์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— v[3]๊ณผ ๋”ํ•ด์ ธ 14๋ผ๋Š” ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋จ 13๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— 14๊ฐ€ ๋“ค์–ด๊ฐ

 

i๊ฐ€ 4๊ฐ€ ๋˜์—ˆ์„ ๋•Œ 12๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  13์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜์ง€๋งŒ ๊ฒฐ๊ตญ 14๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— arr[4][7]์— ์ €์žฅ๋˜๊ณ  arr[n][k]๋ฅผ ์ถœ๋ ฅํ–ˆ์„ ๋•Œ 14๋ผ๋Š” ๊ฐ€์น˜ ์ตœ๋Œ“๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋จ

 

[์ „์ฒด์ฝ”๋“œ]

// 12865_ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ
#include<iostream>
using namespace std;

int n, k; // n : ๋ฌผํ’ˆ์˜ ์ˆ˜ / k = ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ
int arr[101][100001];
int w[101]; // ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ
int v[101]; // ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜

int main() {
    cin >> n >> k; // ๋ฌผํ’ˆ์ˆ˜์™€ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ ์ž…๋ ฅ๋ฐ›์Œ
    for(int i = 1; i <= n; i++){ // ๋ฌด๊ฒŒ์™€ ๊ฐ€์น˜๋ฅผ ๊ฐ๊ฐ ๋ฐฐ์—ด์— ์ €์žฅ
        cin >> w[i] >> v[i];
    }

    for(int i = 1; i <= n; i++){ // 1 - n ๊ฐœ
        for(int j = 0; j <= k; j++){ // 0 - k kg
            if(j >= w[i]) // j๊ฐ€ ๋ฌด๊ฒŒ๋ณด๋‹ค ํด ๋•Œ
                // ๋ฐฐ์—ด์— ๊ทธ ์ „ i๋ฒˆ์งธ ๋ฐฐ์—ด, j์—์„œ ๋ฌด๊ฒŒ๋ฅผ ๋บ์„ ๋•Œ ๊ทธ ๋ฐฐ์—ด ์›์†Œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ€์น˜๋ฅผ ๋”ํ•จ
                // ๋‘˜ ์ค‘์— ๋” ํฐ ๊ฒƒ์„ ํ˜„์žฌ ๋ฐฐ์—ด์— ๋„ฃ์Œ
                arr[i][j] = max(arr[i - 1][j], arr[i - 1][j - w[i]] + v[i]);
            else
                // j๊ฐ€ ๋ฌด๊ฒŒ๋ณด๋‹ค ํฌ์ง€ ์•Š๋‹ค๋ฉด ๊ทธ ์ „ ๋ฐฐ์—ด ์›์†Œ๋ฅผ ๋„ฃ์Œ
                arr[i][j] = arr[i - 1][j];
        }
    }
    // ์ด์ค‘ for ๋ฌธ์ด ๋๋‚˜๋ฉด ๋งจ ๋งˆ์ง€๋ง‰ ๋ฐฐ์—ด์„ ์ถœ๋ ฅ
    cout << arr[n][k];
}

 

 

 

 

 

 

 

Comments