어흥

[백준 1495] 기타리스트 (C++) 본문

알고리즘/백준

[백준 1495] 기타리스트 (C++)

라이언납시오 2020. 9. 28. 19:46
728x90
반응형

문제 링크: www.acmicpc.net/problem/1495

 

1495번: 기타리스트

첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 100, 1 ≤ M ≤ 1000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다.

www.acmicpc.net

1. 주의할 점

- i번째 곡은 p-v[i] or p+v[i]여야 한다(범위가 아니다)

- 최악의 경우 2^100 -> TLE 발생

 

2. 구현

- DFS나 그리디로 구현하면 TLE가 발생할 수도 있다 -> DP로 해결

- N과 M의 범위가 작다 -> 2차 배열을 이용해도 풀 수 있다

- DP[i번째 곡을][이 값으로 연주할 수 있다]: True or False

- 초기에 Result의 값을 -1로 설정한다

- 0번째 곡을 시작 볼륨이라고 하고 1~N번째 곡까지 For문을 통해 DP[][] 배열을 완성한다

- DP[N][] 중에서 True면서 열의 값이 가장 높은 값을 Result에 저장한다

 

#include <iostream>
using namespace std;
int arr[101];
bool dp[101][1001];

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int n, s, maxi, result = -1;
	cin >> n >> s >> maxi;
	for (int i = 1; i <= n; i++)
		cin >> arr[i];
	dp[0][s] = true;
	for (int i = 0; i < n; i++) {
		int val = arr[i + 1];
		for (int j = maxi; j >= 0; j--) {
			if (dp[i][j]) {
				if (j + val <= maxi)
					dp[i + 1][j + val] = true;
				if (j - val >= 0)
					dp[i + 1][j - val] = true;
			}
		}
		
	}
	for (int i = maxi; i >= 0; i--) {
		if (dp[n][i]) {
			result = i;
			break;
		}
	}
	cout << result;
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1175] 배달 (C++)  (0) 2020.10.02
[백준 11451] 팩맨 (C++)  (0) 2020.09.28
[백준 2886] 자리 전쟁 (C++)  (0) 2020.09.22
[백준 4358] 생태학 (C++)  (2) 2020.09.19
[백준 16947] 서울 지하철 2호선 (C++)  (0) 2020.09.15
Comments