import java.io.*;
import java.util.*;
class Main{
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
static StringBuilder sb=new StringBuilder();
public static void main(String args[]) throws Exception {
// String s[]=br.readLine().split(" ");
// int N=Integer.parseInt(s[0]);
// int K=Integer.parseInt(s[1]);
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int K=sc.nextInt();
int[] arr=new int[K+1];
int coin[]=new int[N];
for(int i=0;i<N;i++) {
coin[i]=sc.nextInt();
}
arr[0]=1;
for(int i=0;i<N;i++) {
for(int j=1;j<=K;j++) {
if(j>=coin[i]) arr[j]+=arr[j-coin[i]];
}
}
System.out.println(arr[K]);
}
}
이 문제는 아래 블로그 링크를 참고하여 풀어보았습니다.
이 문제의 포인트는 아래 식입니다.
i원을 만드는 방법의 수=i-1원을 만드는 방법의 수+1원을 만드는 방법의 수
+i-2원을 만드는 방법의 수+2원을 만드는 방법의 수
...+i-n원을 만드는 방법의 수+n원을 만드는 방법의 수
이 식을 구현한 것이 위 코드의 arr[j]+=arr[j-coin[j]]입니다.
방법들을 모두 더해서 arr[K]에는 K원을 만드는 경우의 수가 저장되게 됩니다.
'프로그래밍 문제 > BOJ(백준 온라인 저지)' 카테고리의 다른 글
[BOJ 1520번] 내리막길(JAVA) (0) | 2020.09.14 |
---|---|
[BOJ 11066번] 파일 합치기(JAVA) (0) | 2020.09.11 |
[BOJ 1655번] 가운데를 말해요(JAVA) (0) | 2020.09.09 |
[BOJ 11279번] 최대 힙(JAVA) (0) | 2020.09.08 |
[BOJ 1927번] 최소 힙 (JAVA) (0) | 2020.09.07 |