파게로그
[백준 2293번] 동전 1 본문
문제 링크: 2293번 동전 1
https://www.acmicpc.net/problem/2293
dp[k]는 k원을 만드는 경우의 수를 나타낸다. 이 때 coins[0](엄밀히는 동전 중 임의의 한 개)만을 사용한다면, k가 coins[0]의 배수일 때에는 모두 1가지이므로 if k%coins[0]==0 dp[k]=1을 수행한다. 그 후, coins[1:](엄밀히는 처음에 선택한 동전을 제외한 다른 동전들)에 대해서, dp[k] += dp[k-coin]을 수행한다. coin만을 이용해서 만들 수 있는 경우의 수는 이미 dp[k]에 포함되어 있고, dp[k-coin]은 k-coin원에다가 coin을 이용해 coin만큼을 더해서 k를 만드는 경우의 수이므로 이 둘을 더해준다.
import java.util.Arrays;
import java.util.Scanner;
import java.util.Set;
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
Set<Integer> set = new HashSet<Integer>();
for (int i = 0; i < n; i++)
set.add(sc.nextInt());
n = set.size();
int[] coins = new int[n];
int idx = 0;
for (int item : set)
coins[idx++] = item;
// Arrays.sort(coins);
/* 동전의 크기는 관계없다.
어차피 어떤 동전으로 금액을 만드냐의 차이이지
얼만큼의 금액을 만드냐의 차이가 아니기 때문이다. */
int[] dp = new int[k+1];
for (int i = 0; i <= k; i++)
if (i % coins[0] == 0)
dp[i] = 1;
if (n==1) {
System.out.println(dp[k]);
System.exit(0);
}
for (int c = 1; c < n; c++) {
dp[0] = 1;
int coin = coins[c];
for (int money = 1; money <= k; money++)
if (coin <= money)
dp[money] += dp[money-coin];
}
System.out.println(dp[k]);
}
}
'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글
[백준 2606번] 바이러스 (0) | 2020.12.28 |
---|---|
[백준 1260번] DFS와 BFS (0) | 2020.12.28 |
[백준 1520번] 내리막 길 (0) | 2020.12.18 |
[백준 11066번] 파일 합치기 (0) | 2020.12.18 |
[백준 11049번] 행렬 곱셈 순서 (0) | 2020.12.18 |
Comments