완전탐색 dfs 로 풀리던 문제를 시간 복잡도를 고려하여 냅색으로 풀어본다.
coin 배열 coinArr과 동전 개수를 저장할 dp 배열 dy를 만든다.
j번째 동전의 개수 인 dy[j]는 j원을 거슬러 주기 위해 사용된 동전의 최소 개수 이다.
coin 별로 거슬러 줄 동전의 개수를 계산하고 dy에 저장해준다.
package inflearn;
import java.util.Scanner;
public class I1005 {
static int n;
static int m;
static int[] dy;
static int[] coinArr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
coinArr = new int[n];
for (int i = 0; i < n; i++) {
coinArr[i] = sc.nextInt();
}
m = sc.nextInt();
dy = new int[m + 1];
for (int i = 1; i < dy.length; i++) {
dy[i] = Integer.MAX_VALUE;
}
System.out.println(knapsack());
}
static int knapsack() {
for (int coin : coinArr) {
for (int j = coin; j <= m; j++) {
int tmp = dy[j - coin] + 1;
if (dy[j] > tmp) dy[j] = tmp;
}
}
return dy[m];
}
}