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๊ฐ์ ๋ํด ์ ๋ถ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํ๋ค.
- ์ถ ํ๋๋ง ์ผ์ชฝ์ ๋๋ ๊ฒฝ์ฐ, ์ค๋ฅธ์ชฝ์ ๋๋ ๊ฒฝ์ฐ ๊ณ์ฐ
- ์ง๊ธ๊น์ง ๋ง๋ค์ด์ง ๋ฌด๊ฒ๋ค์ ๋ํด ์ผ์ชฝ์ ๋๋ ๊ฒฝ์ฐ, ์ค๋ฅธ์ชฝ์ ๋๋ ๊ฒฝ์ฐ ๊ณ์ฐ
Knapsack DP๋ ํ๋ค์ด์ผ๋ก ํ๊ธฐ ํ๋ค๊ณ , ๋ฐํ ์ ์ผ๋ก ํธ๋๊ฒ ํจ์ฌ ์ ํ๋ฆฐ๋ค. ์ ๊ทธ๋ฐ์ง๋ ๋ค์์ ํฌ์คํ ํ ์์ ์ด๋ค.