이 문제는 동전문제와 비슷하다. 하지만 이 문제에서 유의할 점은 동전을 오직 한번만 사용해야한다는 것이다.
이를 위해 합으로 만들어야 하는 수만큼 dp 값을 만들고, 뒤에서부터 탐색을 진행한다. 순서는 상관이 없으니 고려하지 않는다.
0 | 10000 | 10000 | 10000 | 10000 | 10000 |
여기서 만약 2로 앞에서부터 탐색한다면,
0 | 10000 | 1 | 10000 | 2 | 10000 |
이런식으로 중복돼서 사용되는 경우도 포함되어 오류가 발생한다.
import java.util.*;
import java.io.*;
import java.math.*;
public class Main {
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 m = Integer.parseInt(st.nextToken());
int[] arr = new int[n];
st = new StringTokenizer(br.readLine());
for(int i = 0;i<n;i++){
arr[i] = Integer.parseInt(st.nextToken());
}
int[] dp = new int[m+1];
for(int i = 1;i<=m;i++){
dp[i] = 100000;
}
for(int i = 0;i<n;i++){
for(int j = m;j>=1;j--){
if(j - arr[i] >= 0){
dp[j] = Math.min(dp[j],dp[j-arr[i]]+1);
}
}
}
if(dp[m] == 100000) System.out.println(-1);
else System.out.println(dp[m]);
}
}
'알고리즘 > 코드트리 문제풀이' 카테고리의 다른 글
코드트리 [자바 java] 연속 부분 합의 최댓값 구하기 (0) | 2023.08.14 |
---|---|
코드트리 [자바 java] 동전 거슬러주기 (0) | 2023.08.13 |
코드트리 [자바 java] 조삼모사 (0) | 2023.08.11 |
코드트리 [자바 java] 최소 경로로 탈출하기 (0) | 2023.08.10 |
코드트리 [자바 java] 정수 사각형 최대 합 (0) | 2023.08.08 |