1495번: 기타리스트
첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 100, 1 ≤ M ≤ 1000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다.
www.acmicpc.net
# dp[i][j] = i번째 노래일때 j볼륨이 연주 가능한지 여부
#
# data = [5, 3, 7]
#
# j=0 1 2 3 4 5 6 7 8 9 10 (볼륨)
# 0 0 0 0 0 1 0 0 0 0 0
# i=1 (1번곡) 1 0 0 0 0 0 0 0 0 0 1
# i=2 (2번곡) 0 0 0 1 0 0 0 1 0 0 0
# i=3 (3번곡) 1 0 0 0 0 0 0 0 0 0 1
def run(N, S, M, a):
dp = [[0] * (M+1) for _ in range(N+1)]
dp[0][S] = 1
a = [0] + a # dp와 a 인덱스 동일하게 맞추기
for i in range(1, N+1):
diff = a[i]
for j in range(0, M+1):
if dp[i-1][j] == 1:
if j + diff <= M:
dp[i][j + diff] = 1
if j - diff >= 0:
dp[i][j - diff] = 1
volumns = [i for i, v in enumerate(dp[N]) if v == 1]
return max(volumns) if volumns else -1
N, S, M = map(int, input().split())
data = list(map(int, input().split()))
print(run(N, S, M, data))
'BOJ 알고리즘 (패캠) > DP' 카테고리의 다른 글
2655번: 가장높은탑쌓기 LIS (DP) - Fastcampus (0) | 2020.10.11 |
---|---|
9251번: LCS 가장 긴 공통 부분수열 (DP) - Fastcampus (0) | 2020.10.10 |
11053번: LIS 가장 긴 증가하는 부분수열 (DP) - Fastcampus (0) | 2020.10.10 |
12865번: 평범한 배낭 (DP) - Fastcampus (0) | 2020.10.09 |
1904번: 01타일 (DP) - Fastcampus (0) | 2020.10.09 |