https://www.acmicpc.net/problem/14916
코드설명
DP 문제입니다.
각 액수를 만들기 위한 DP를 만들고, 해당 값에 2원과 5원을 더하는 경우의 최소값을 구한뒤 추가로 2원과 5원을 더하는경우로 1을 더해가며 진행했습니다.
DP로 풀지않고 반복문을 활용하여 해결도 가능합니다.
N에 만약 5로 나눠진다면 5로 나눈값을 더해주고 반복문을 끝냅니다.
만약 5로 나누어지지않는다면, -2 를 계속해서 진행해줍니다.
위의 과정을 N이 > 0 인 동안 계속해서 진행하면됩니다.
마지막에 N == 0 이 아니라면, (N < 0 이라면) 해당 계산은 불가능한것이므로, -1 을 출력합니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int N;
public static int[] dp;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
dp = new int[100001];
dp[0] = 0;
dp[1] = 0;
dp[2] = 1;
dp[3] = 0;
dp[4] = 2;
dp[5] = 1;
for(int i=6; i<=N;i++) {
if(dp[i-2] == 0 && dp[i-5] == 0 ) {
dp[i] = 0;
}
else if(dp[i-2] > 0 && dp[i-5] == 0 ) {
dp[i] = dp[i-2] + 1;
}
else if(dp[i-2] == 0 && dp[i-5] > 0 ) {
dp[i] = dp[i-5] + 1;
}else {
dp[i] = Math.min(dp[i-2], dp[i-5]) + 1;
}
}
if(dp[N] == 0)
System.out.println("-1");
else
System.out.println(dp[N]);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2217 로프 - 수학 + 그리디 + 정렬 JAVA (0) | 2023.07.20 |
---|---|
[백준] 1343 폴리오미노 - 그리디 + 구현 JAVA (0) | 2023.07.20 |
[백준] 1789 수들의 합 - 수학 JAVA (0) | 2023.07.19 |
[백준] 14391 종이 조각 - 완전탐색(BruteForce) + DFS(깊이우선탐색) JAVA (0) | 2023.07.18 |
[백준] 16637 괄호 추가하기 - 완전탐색(BruteForce) + DFS(깊이우선탐색) + 연산자 JAVA (0) | 2023.07.18 |