알고리즘/백준
BOJ 2629. 양팔저울
아헿헿헿
2022. 7. 15. 07:50
BOJ 2629. 양팔저울
랭크 : 골드3
문제 풀이
dp를 통해, 이전까지의 가능한 무게값을 배열에 다 저장해두고, 이를 바탕으로 새로 들어온 무게추의 크기를 더하거나 빼거나, 그대로 두면서 가능한 조합을 모두 뽑아냅니다.
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
int N, M, tmp;
int board[31][80'001];
int main() {
int MAXX = 0;
fastio;
cin >> N;
board[0][40'000] = 1;
for (int i=0; i<N; i++) {
cin >> tmp;
for (int j= -MAXX; j<= MAXX; j++) {
if (board[i][40'000 + j]) {
board[i+1][40'000 + j] = 1;
if (40'000 + j - tmp >= 0) board[i+1][40'000 + j - tmp] = 1;
if (j + tmp <= 40'000) board[i+1][40'000 + j + tmp] = 1;
}
}
MAXX = min(MAXX + tmp, 40'000);
}
cin >> M;
for (int i=0; i<M; i++) {
cin >> tmp;
if (board[N][40'000 + tmp] || board[N][40'000 - tmp]) cout << "Y ";
else cout << "N ";
}
cout << endl;
}
알고리즘 |
시간복잡도 |
공간복잡도 |
---|---|---|
dp | $O(N*M)$ | $O(N*M)$ |