dp[i][j] = dp[i-1][j]
dp[i][j] = 1
dp[i][j] = dp[i-1][j]
dp[i][j] = Math.min(dp[i][gap] + 1, dp[i-1][j])
2-2) 조건에 2-1)번 조건을 같이 묶으려고 했었을 때, 만들 수 없는 금액에 동전 선택의 경우의 수가 할당 되버림
if(dp[i][gap] == 0 || gap != 0)
모두 0으로 만들어 져 버림.그래서
gap != 0
이 부분 빼버리고 그냥 진행하려고,if(gap < 0){ dp[i][j] = dp[i-1][j]; } else{ // gap >= 0 if(dp[i][gap] == 0){ dp[i][j] = dp[i-1][j]; }else{ dp[i][j] = Math.min(dp[i][gap] + 1 , dp[i-1][j]); } }
이런식으로 해버리니까 만들 수 없는 금액에 동전의 경우의 수가 할당 되어 버림
6에서 1개의 개수로 만들 수 있다고 나옴;;
public class BackJoonMemo {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int[][] dp = new int[n+1][k+1];
int[] coins = new int[n];
for(int i = 0; i<n; i++){
st = new StringTokenizer(br.readLine());
coins[i] = Integer.parseInt(st.nextToken());
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= k; j++){
int gap = j - coins[i-1];
if(gap < 0){
dp[i][j] = dp[i-1][j];
}else{ // gap >= 0
if(gap == 0){
dp[i][j] = 1;
}
else if(dp[i][gap] == 0){
dp[i][j] = dp[i-1][j];
}
else{
if(dp[i][gap] != 0){
dp[i][j] = dp[i][gap] + 1;
if(dp[i-1][j] != 0){
dp[i][j] = Math.min(dp[i][j], dp[i-1][j]);
}
}
}
}
}
}
/*for(int i = 1; i<=n; i++){
System.out.print(coins[i-1] + " ");
for(int j = 0; j<= k; j++){
System.out.print(j + " : " + dp[i][j] + ", ");
}
System.out.println();
}*/
System.out.println(dp[n][k] == 0 ? -1 : dp[n][k]);
}
}