※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts