[ 문제 ]
[ 접근방법 ]
직전 상황에 가능한 볼륨값에서 현재 볼륨 차이를 적용하여 가능한 볼륨값을 주기적으로 갱신한다.
시간복잡도는 O(N*M)으로 충분하다.
[ 소스코드 ]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, s, m;
vector<int> vol;
vector<bool> cur, nxt;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> s >> m;
vol.resize(n + 1);
cur.resize(m + 1, false);
nxt.resize(m + 1, false);
for(int i = 1; i <= n; i++)cin >> vol[i];
cur[s] = true;
for(int i = 1; i <= n; i++){
fill(nxt.begin(), nxt.end(), false);
for(int j = 0; j <= m; j++){
if(cur[j]){
if((j + vol[i]) <= m){
nxt[j + vol[i]] = true;
}
if((j - vol[i]) >= 0){
nxt[j - vol[i]] = true;
}
}
}
swap(cur, nxt);
}
int ans = -1;
for(int i = m; i >= 0; i--){
if(cur[i]){
ans = i;
break;
}
}
cout << ans;
return 0;
}
'PS' 카테고리의 다른 글
[ 백준 / C++ ] 4659 : 비밀번호 발음하기 (0) | 2024.12.10 |
---|---|
[ 백준 / C++ ] 2961 : 도영이가 만든 맛있는 음식 (0) | 2024.12.09 |
[ 백준 / C++ ] 2304 : 창고 다각형 (0) | 2024.12.04 |
[ 백준 / C++ ] 5397 : 키로거 (0) | 2024.11.28 |
[ 백준 / C++ ] 1890 : 점프 (0) | 2024.11.27 |