※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1495번 문제인 기타리스트이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1495
1495번: 기타리스트
첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 100, 1 ≤ M ≤ 1000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다.
www.acmicpc.net
이 문제는 DP로 해결할 수 있는 문제이다.
매번 곡을 연주할 때마다, 바로 이전 곡을 연주한 직후 가능한 각 볼륨들에 대하여 조절할 수 있는 볼륨을 더하거나 뺀 값의 볼륨으로 다음 곡을 연주한다는 것을 배열을 이용해 메모이제이션하는 것으로 충분히 풀 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
bool dp[101][1001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, S, M; cin >> N >> S >> M;
dp[0][S] = 1;
for (int i = 0; i < N; i++) {
int vol; cin >> vol;
for (int j = 0; j <= M; j++) {
if (dp[i][j]) {
if (j - vol >= 0) dp[i + 1][j - vol] = 1;
if (j + vol <= M) dp[i + 1][j + vol] = 1;
}
}
}
int ans = -1;
for (int j = 0; j <= M; j++) {
if (dp[N][j]) ans = j;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17843 // C++] 시계 (0) | 2022.06.12 |
---|---|
[BOJ 1922 // C++] 네트워크 연결 (0) | 2022.06.11 |
[BOJ 1965 // C++] 상자넣기 (0) | 2022.06.09 |
[BOJ 1051 // C++] 숫자 정사각형 (0) | 2022.06.08 |
[BOJ 1034 // C++] 램프 (0) | 2022.06.07 |