Study hard

(c++)백준 1459번: 기타리스트 본문

백준/DP

(c++)백준 1459번: 기타리스트

Nimgnoej 2020. 9. 15. 18:55

www.acmicpc.net/problem/1495

 

1495번: 기타리스트

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

www.acmicpc.net

[풀이]

DP로 풀 수 있는 문제였다.

DP[i][j] : i번째 곡을 j 볼륨으로 연주 가능한가?(boolean)

점화식

if DP[i][j] AND j+V[i] <= M : DP[i+1][j+V[i]] = true

            AND j-V[i] >= 0 : DP[i+1][j-V[i]] = true

 

#include <iostream>
#include <algorithm>//max
using namespace std;

int N, S, M;
int V[101];
bool DP[101][1001];

void solution() {
	for (int i = 0; i <= N - 1; i++) {
		for (int j = 0; j <= M; j++) {
			if (DP[i][j]) {
				if (j + V[i + 1] <= M)
					DP[i + 1][j + V[i + 1]] = true;
				if (j - V[i + 1] >= 0)
					DP[i + 1][j - V[i + 1]] = true;
			}
		}
	}
	int res = -1;
	for (int i = 0; i <= M; i++) {
		if (DP[N][i])
			res = i;
	}
	cout << res << '\n';
}

int main() {
	cin >> N >> S >> M;
	for (int i = 1; i <= N; i++) {
		cin >> V[i];
	}
	DP[0][S] = true;
	solution();
	return 0;
}

 

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

(c++)백준 10422번: 괄호  (0) 2020.09.16
(c++)백준 12869번: 뮤탈리스크  (0) 2020.09.15
(c++)백준 12865번: 평범한 배낭  (0) 2020.09.15
(c++)백준 11066번: 파일 합치기  (0) 2020.09.15
(c++)백준 15989번: 1, 2, 3 더하기 4  (0) 2020.09.14