Problem Solving/BOJ(백준)

[BOJ]백준 1495번: 기타리스트(C++)/DP

이진2 2021. 8. 15. 00:51

https://www.acmicpc.net/problem/1495

 

1495번: 기타리스트

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

www.acmicpc.net

현재 볼륨이 범위에 적합하지 않는 경우(불가능)일 때와, 아직 계산하지 않은 경우(가능 여부 모름)일 때를 분리해주어야 한다는 걸 시간초과 덕분에 알았다

#include <cstdio>
#include <algorithm>
using namespace std;

int n, s, m;
int v[101], cache[101][1001];

int dp(int cur, int dep) {
	if (cur<0 || cur>m)return -100;
	if (dep == n) return cur;

	int& ret = cache[dep][cur];
	if (ret != -1) return ret;

	return ret = max(dp(cur - v[dep], dep + 1), dp(cur + v[dep], dep + 1));
}

int main() {
	scanf("%d%d%d", &n, &s, &m);
	for (int i = 0; i < n; i++)scanf("%d", &v[i]);

	fill(&cache[0][0], &cache[n][m + 1], -1);

	int result = dp(s, 0);
	printf("%d", result==-100?-1:result);
	return 0;
}