알고리즘문제풀이/백준
[BOJ]2293_동전1_Java
초보개발자..
2021. 11. 23. 19:57
--문제--
https://www.acmicpc.net/problem/2293
2293번: 동전 1
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.
www.acmicpc.net
--문제 접근--
처음 문제를 봤을 때 중복 조합을 만들어 K를 만든다면 +1을 하여 답을 구하려 했는데 시간 초과가 나타났습니다.
다시 조건을 보니 당연한 시간 초과였습니다..
그리하여 다르게 생각해본 결과 DP를 통해 문제를 푸는 방법을 고려하였습니다.
1.dp배열을 만듭니다.
2.dp [금액]=금액을 만드는데 가능한 경우의 수
3. dp [i]=dp [i]+dp [i-coin]입니다.
N은 2로 하고 K는 5 로 가정해서 해보겠습니다.
맨 처음 dp [0]=은 1 로 가정하고 시작합니다. 그래야 진행할 수 있습니다.
2 5
1
2
1원을 통해 만드는 dp값
1 | 2 | 3 | 4 | 5 |
1 | 1 | 1 | 1 | 1 |
2원을 통해 만드는 dp값
1 | 2 | 3 | 4 | 5 |
1 | 1(원래dp[2])+1(dp[2-2(coin)]=2 | 1+1(dp[3-2(coint)]=2 | 3 | 3 |
dp [i]=dp [i]+ dp [i-coin]
--코드--
package 기초백준추천문제;
import java.util.Scanner;
public class BOJ_2293_동전1 {
//문제접근
//처음에는 중복조합을 만들어 K를 만든다면 1+를 하여 답을 구하려했는데 시간초과가 나타났다.
// 다른방법을 고려해야하는데..
static int[] num;
static int N,ans,K;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
K=sc.nextInt();
num=new int[N];
int[] arr=new int[N+1];
int[] dp=new int[K+1];
dp[0]=1;
for(int i=1;i<=N;i++) {
arr[i]=sc.nextInt();
for(int j=arr[i];j<=K;j++) {
dp[j]+=dp[j-arr[i]];
}
}
System.out.println(dp[K]);
//아래는 중복조합
// for(int i=0;i<N;i++) {
// num[i]=sc.nextInt();
// }
// ans=0;
// DFS(0,0,0);
}
//중복조합구하는가정
// private static void DFS(int idx, int start, int tmp) {
// if(tmp>=K) {
// if(tmp==K)ans++;
// return;
// }
// for(int i=start;i<N;i++) {
// DFS(idx+1,i,tmp+num[i]);
// }
//
// }
}