2 min read

๋ฐฑ์ค€ 2629๋ฒˆ ์–‘ํŒ”์ €์šธ

๋ฌธ์ œ ๋งํฌ

DP ๋ฌธ์ œ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ™”ํ•ด์„œ, ๊ตฌ์Šฌ์€ ํ•ญ์ƒ ์ €์šธ์˜ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์ด ๋•Œ ์ถ”๋ฅผ ์˜ค๋ฅธ์ชฝ์— ๋†“์œผ๋ฉด ๊ตฌ์Šฌ์˜ ๋ฌด๊ฒŒ๊ฐ€ ์˜ฌ๋ผ๊ฐ€์•ผํ•˜๊ณ , ์ถ”๋ฅผ ์™ผ์ชฝ์— ๋†“์€ ๊ตฌ์Šฌ์˜ ๋ฌด๊ฒŒ๊ฐ€ ๋‚ด๋ ค๊ฐ€์•ผํ•œ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๊ณ„์‚ฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์Œ์ˆ˜ ๋ฌด๊ฒŒ๋„ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ๋” ํฐ ์ถ”๋ฅผ ์˜ค๋ฅธ์ชฝ์— ๋†“์•„์„œ ๊ฒฐ๊ตญ ์–‘์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

constexpr int MAX = 15001;
bool dp[30][30005];

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n, m;
    cin >> n;
    vector<int> v(n);
    for (auto& x : v) {
        cin >> x;
    }
    cin >> m;
    vector<int> cv(m);
    for (auto& x : cv) {
        cin >> x;
    }

    dp[0][MAX+v[0]] = 1;
    dp[0][MAX-v[0]] = 1;

    for (int i = 1; i < n; i++) {
        dp[i][MAX+v[i]] = 1;
        dp[i][MAX-v[i]] = 1;
        for (int j = 0; j <= 30003; j++) {
            dp[i][j] += dp[i-1][j];
            if (j >= v[i]) {
                dp[i][j-v[i]] += dp[i-1][j];
                dp[i][j] += dp[i-1][j-v[i]];
            }
        }
    }

    for (auto x : cv) {
        if (x >= MAX) cout << "N ";
        else if (dp[n-1][x+MAX]) cout << "Y ";
        else cout << "N ";
    }

    return 0;
}

๊ฐ€์šด๋ฐ MAX๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์–‘์ˆ˜, ์Œ์ˆ˜๋ฅผ ๋‚˜๋ˆˆ๋‹ค. ์ถ” 30๊ฐœ์— ๋Œ€ํ•ด ์ „๋ถ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐํ•œ๋‹ค.

  1. ์ถ” ํ•˜๋‚˜๋งŒ ์™ผ์ชฝ์— ๋†“๋Š” ๊ฒฝ์šฐ, ์˜ค๋ฅธ์ชฝ์— ๋†“๋Š” ๊ฒฝ์šฐ ๊ณ„์‚ฐ
  2. ์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“ค์–ด์ง„ ๋ฌด๊ฒŒ๋“ค์— ๋Œ€ํ•ด ์™ผ์ชฝ์— ๋†“๋Š” ๊ฒฝ์šฐ, ์˜ค๋ฅธ์ชฝ์— ๋†“๋Š” ๊ฒฝ์šฐ ๊ณ„์‚ฐ

Knapsack DP๋Š” ํƒ‘๋‹ค์šด์œผ๋กœ ํ’€๊ธฐ ํž˜๋“ค๊ณ , ๋ฐ”ํ…€์—…์œผ๋กœ ํ‘ธ๋Š”๊ฒŒ ํ›จ์”ฌ ์ž˜ ํ’€๋ฆฐ๋‹ค. ์™œ ๊ทธ๋Ÿฐ์ง€๋Š” ๋‹ค์Œ์— ํฌ์ŠคํŒ…ํ•  ์˜ˆ์ •์ด๋‹ค.