알고리즘 문제
[C/C++ 백준 1495번] 기타리스트 (Silver 1)
새파란 공대생
2020. 5. 25. 15:03
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[i][j] (int나 bool로 선언, i번째 곡의 j크기 볼륨이 가능하면 1, 아니면 0을 저장)를 만들어 모두 구해주면 된다. i-1 번째 곡의 j볼륨이 1이면, j+V[i]와 j-V[i]를 체크해 새로운 dp를 만들어주면 된다.
다만 매개변수가 많으니 꼼꼼하게 체크하자.
#include <cstdio>
#include <algorithm>
using namespace std;
int main(void){
int N, S, M, V[101]={},dp[101][1001]={}, anscnt=-1;
scanf("%d %d %d", &N, &S, &M);
for(int i=1; i<=N; i++){
scanf("%d", &V[i]);
for(int j=0; j<=M; j++){
if(i==1){
if(j==S+V[i] || j==S-V[i])
dp[i][j]=1;
}
else{
if(dp[i-1][j]==1)
{
if(j+V[i]<=M && j+V[i]>=0)
dp[i][j+V[i]]=1;
if(j-V[i]<=M && j-V[i]>=0)
dp[i][j-V[i]]=1;
}
}
}
}
for(int k=0; k<=M; k++){
if(dp[N][k]==1){
anscnt=k;
}
}
if(anscnt==-1) printf("-1");
else printf("%d",anscnt);
}