๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 12865 : ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ (DP) / ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ํฌํ•จ

https://www.acmicpc.net/problem/12865

 

๋ฌธ์ œ

์ด ๋ฌธ์ œ๋Š” ์•„์ฃผ ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ์— ๊ด€ํ•œ ๋ฌธ์ œ์ด๋‹ค.

ํ•œ ๋‹ฌ ํ›„๋ฉด ๊ตญ๊ฐ€์˜ ๋ถ€๋ฆ„์„ ๋ฐ›๊ฒŒ ๋˜๋Š” ์ค€์„œ๋Š” ์—ฌํ–‰์„ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์„ธ์ƒ๊ณผ์˜ ๋‹จ์ ˆ์„ ์Šฌํผํ•˜๋ฉฐ ์ตœ๋Œ€ํ•œ ์ฆ๊ธฐ๊ธฐ ์œ„ํ•œ ์—ฌํ–‰์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์ง€๊ณ  ๋‹ค๋‹ ๋ฐฐ๋‚ญ ๋˜ํ•œ ์ตœ๋Œ€ํ•œ ๊ฐ€์น˜ ์žˆ๊ฒŒ ์‹ธ๋ ค๊ณ  ํ•œ๋‹ค.

์ค€์„œ๊ฐ€ ์—ฌํ–‰์— ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” N๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ๋‹ค. ๊ฐ ๋ฌผ๊ฑด์€ ๋ฌด๊ฒŒ W์™€ ๊ฐ€์น˜ V๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ํ•ด๋‹น ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์–ด์„œ ๊ฐ€๋ฉด ์ค€์„œ๊ฐ€ V๋งŒํผ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์•„์ง ํ–‰๊ตฐ์„ ํ•ด๋ณธ ์ ์ด ์—†๋Š” ์ค€์„œ๋Š” ์ตœ๋Œ€ K๋งŒํผ์˜ ๋ฌด๊ฒŒ๋งŒ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฐ๋‚ญ๋งŒ ๋“ค๊ณ  ๋‹ค๋‹ ์ˆ˜ ์žˆ๋‹ค. ์ค€์„œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ฆ๊ฑฐ์šด ์—ฌํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์•Œ๋ ค์ฃผ์ž.

์ž…๋ ฅ

์ฒซ ์ค„์— ๋ฌผํ’ˆ์˜ ์ˆ˜ N(1 ≤ N ≤ 100)๊ณผ ์ค€์„œ๊ฐ€ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ K(1 ≤ K ≤ 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑฐ์ณ ๊ฐ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ W(1 ≤ W ≤ 100,000)์™€ ํ•ด๋‹น ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜ V(0 ≤ V ≤ 1,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜๋Š” ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

ํ•œ ์ค„์— ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


 

๊ณจ๋“œ5.

์ข€ ์–ด๋ ค์šด dp๋ฌธ์ œ๋‹ค ์‹ถ์œผ๋ฉด ํ•ญ์ƒ ์ด์ฐจ์›๋ฐฐ์—ด ํ‘œ๋กœ ์ƒ๊ฐํ•ด์•ผํ•˜๋Š”๋“ฏ

๋ฐฐ๋‚ญ ๋ฌธ์ œ๋Š” ์œ ๋ช…ํ•œ DP๋ผ๊ณ  ํ•œ๋‹ค!

๋‚˜๋งŒ ๋ชฐ๋ž์ง€ ๋˜

 

์ด๋ฒˆ์—๋Š” ํ–‰ ์ธ๋ฑ์Šค = ๋ฌผ๊ฑด ๋ฒˆํ˜ธ, ์—ด ์ธ๋ฑ์Šค = ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ(๋ˆ„์ ๋ฌด๊ฒŒ), dp๋‚ด์šฉ = ๋ˆ„์  ๊ฐ€์น˜

์ด๋ ‡๊ฒŒ ๋‘๊ณ  ํ‘œ๋ฅผ ๊ทธ๋ ค๋ณด์•˜๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ํ…Œ์ผ€๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

 

4 7
6 13
4 8
3 6
5 12

 

์ด๊ฒƒ์„ ํ‘œ๋กœ ๊ทธ๋ ค๋ณด๋ฉด,

 

๋ฌผ๊ฑด \ ๋ˆ„์ ๋ฌด๊ฒŒ 1 2 3 4 5 6 7
1 (๋ฌด๊ฒŒ6, ๊ฐ€์น˜ 13) 0 0 0 0 0 13 13
2 (๋ฌด๊ฒŒ4, ๊ฐ€์น˜8) 0 0 0 8 8 13 13
3 (๋ฌด๊ฒŒ3, ๊ฐ€์น˜6) 0 0 6 8 8 13 14 (8+6)
4 (๋ฌด๊ฒŒ5, ๊ฐ€์น˜12) 0 0 6 8 12 13 14

 

์ฒ˜์Œ์— ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ๋Š”๋ฐ, ์ฐจ๋ถ„ํžˆ ํ•˜๋‚˜์”ฉ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ํ’€๋ ธ๋‹ค

ํ•ด๋‹นํ•˜๋Š” ๋ฌผ๊ฑด ๋ฒˆํ˜ธ์—์„œ ํ•ด๋‹นํ•˜๋Š” ๋ˆ„์ ๋ฌด๊ฒŒ๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ฑ„์šฐ๋ฉด ๋œ๋‹ค.

 

๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ๋Œ๋ ค๋ณด์ž

 

5 10
9 5
5 10
9 5
4 8
8 9
7 8
5 3

 

์œ„ testcase๋ฅผ ๋„ฃ์œผ๋ฉด ํ‘œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜ค๊ณ , ๋‹ต์€ 11์ด๋‹ค.

 

ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ์‹คํ–‰๊ฒฐ๊ณผ

 

 

 

๋‚˜์˜ ํ’€์ด

#include <iostream>
#include <string>
using namespace std;

int dp[101][100001];

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n;
    int k;
    int wv[101][2] = {0};
    
    cin >> n >> k;
    for (int i = 1; i <= n; ++i){
        cin >> wv[i][0] >> wv[i][1]; // 0:๋ฌด๊ฒŒ, 1:๊ฐ€์น˜
    }
    // dp ํ–‰: ๋ฌผ๊ฑด ๋ฒˆํ˜ธ & ์—ด : ๋ˆ„์  ๋ฌด๊ฒŒ & ๊ฐ’ :  ๋ˆ„์  ๊ฐ€์น˜
    
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= k; ++j){
            if(j >=  wv[i][0]){ // ๋ˆ„์  ๋ฌด๊ฒŒ๊ฐ€ ๊ทธ ๋ฌผ๊ฑด ๋ฌด๊ฒŒ ์ด์ƒ์ผ๋•Œ
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-wv[i][0]] + wv[i][1]);
                // ํ˜„์žฌ๋ฌผ๊ฑด์„ ๋„ฃ๊ธฐ ์ „ ๋ฌด๊ฒŒ์˜ max๊ฐ€์น˜์™€, (ํ˜„์žฌ๋ฌด๊ฒŒ๋งŒํผ ๋บ์„๋•Œ์˜ ์ „ ๋ฌด๊ฒŒ+ํ˜„์žฌ๋ฌผ๊ฑด ๋ฌด๊ฒŒ)์˜ ๊ฐ€์น˜๋ฅผ ๋น„๊ต
            } else{
                dp[i][j] = dp[i - 1][j];
            }
            // cout << dp[i][j] << " ";
        }
        // cout << "\n";
    }
    cout << dp[n][k];
}