Algorithm/백준 알고리즘

백준_1495 기타리스트(자바) / DP

미스터로즈 2021. 5. 15. 10:45

시간 & 메모리 제한

문제

입력 & 출력

DP를 이용한 문제풀이

package com.Back;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Back_1495 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int S = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		
		int[] arr = new int[N+1];
		boolean[][] dp = new boolean[N+1][M+1];
		
		st = new StringTokenizer(br.readLine());
		for (int i = 1; i <= N; i++) {
			arr[i]=Integer.parseInt(st.nextToken());
		}
		
		dp[0][S]=true;
		for (int i = 1; i <= N; i++) {
			for (int j = 0; j <=M; j++) {
				if(dp[i-1][j]) {
					if(j+arr[i]<=M) {
						dp[i][j+arr[i]]=true;
					}
					if(j-arr[i]>=0) {
						dp[i][j-arr[i]]=true;
					}
				}
			}
		}
		
		int ans=-1;
		for (int i = 0; i <= M; i++) {
			if(dp[N][i]) {
				ans = Math.max(ans, i);
			}
		}
		
		System.out.println(ans);
	}

}

- 이 문제는 DP를 활용해서 문제 풀이를 할 수 있습니다.

 

- 일단은 dp를 이중 배열로 만들어야 된다는 것을 알 수 있습니다.

- 위 그림과 같이 만들도록 이중 for문을 돌려줍니다.

 

- 그 안에서 0보다 작은 경우와 10보다 큰 경우에 대해서 dp에 계산을 해줍니다.