๐ ๋ฌธ์
https://www.acmicpc.net/problem/9084
๋ฌธ์
์ฐ๋ฆฌ๋๋ผ ํํ๋จ์, ํนํ ๋์ ์๋ 1์, 5์, 10์, 50์, 100์, 500์์ด ์๋ค. ์ด ๋์ ๋ค๋ก๋ ์ ์์ ๊ธ์ก์ ๋ง๋ค ์ ์์ผ๋ฉฐ ๊ทธ ๋ฐฉ๋ฒ๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์๋ค. ์๋ฅผ ๋ค์ด, 30์์ ๋ง๋ค๊ธฐ ์ํด์๋ 1์์ง๋ฆฌ 30๊ฐ ๋๋ 10์์ง๋ฆฌ 2๊ฐ์ 5์์ง๋ฆฌ 2๊ฐ ๋ฑ์ ๋ฐฉ๋ฒ์ด ๊ฐ๋ฅํ๋ค.
๋์ ์ ์ข ๋ฅ๊ฐ ์ฃผ์ด์ง ๋์ ์ฃผ์ด์ง ๊ธ์ก์ ๋ง๋๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ธ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T(1 ≤ T ≤ 10)๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ ๋ฒ์งธ ์ค์๋ ๋์ ์ ๊ฐ์ง ์ N(1 ≤ N ≤ 20)์ด ์ฃผ์ด์ง๊ณ ๋ ๋ฒ์งธ ์ค์๋ N๊ฐ์ง ๋์ ์ ๊ฐ ๊ธ์ก์ด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์ฃผ์ด์ง๋ค. ๊ฐ ๊ธ์ก์ ์ ์๋ก์ 1์๋ถํฐ 10000์๊น์ง ์์ ์ ์์ผ๋ฉฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋๋ค. ์ธ ๋ฒ์งธ ์ค์๋ ์ฃผ์ด์ง N๊ฐ์ง ๋์ ์ผ๋ก ๋ง๋ค์ด์ผ ํ ๊ธ์ก M(1 ≤ M ≤ 10000)์ด ์ฃผ์ด์ง๋ค.
ํธ์๋ฅผ ์ํด ๋ฐฉ๋ฒ์ ์๋ 231 - 1 ๋ณด๋ค ์๊ณ , ๊ฐ์ ๋์ ์ด ์ฌ๋ฌ ๋ฒ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ N๊ฐ์ง ๋์ ์ผ๋ก ๊ธ์ก M์ ๋ง๋๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
์ด ๋ฌธ์ ๋ "๊ฒฝ์ฐ์ ์"๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์์ ์ ์ํด์ผ ํ๋ค. ์ฐจ๊ทผ์ฐจ๊ทผ ์ ๊ทผํ๋ ๊ฒจ์ฐ ์ดํด๋๋ค.
๋จผ์ ์ด ๊ฐ๋ ์ ์ดํดํด์ผ ํ๋ค.
๐ ํน์ ๋์ ์ "์จ์ผํ๋ค"๋ ๊ฒ์, (ํน์ ๋์ ์ ์ ์ด ๊ธ์ก)์ (ํน์ ๋์ )์ ์จ์ (๋ชฉํ ๊ธ์ก)์ ๋ง๋ ๋ค๋ ๋ป์ด๋ค.
์ฆ, (๋ชฉํ ๊ธ์ก-ํน์ ๋์ ๊ธ์ก)์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์์ (ํน์ ๋์ )๋ฅผ ์ฐ๋ ์ผ์ด์ค๊ฐ ์ถ๊ฐ๋๋ ๊ฒ์ด๋ค.
โก๏ธ ์ ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์๋ ์์๋ฅผ ์ดํด๋ณด์.
1์์ ๊ฐ์ง๊ณ 1์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ ํ ๊ฐ์ง์ด๋ค. 1์๋ณด๋ค ์์ ๋์ ์ ์๊ธฐ ๋๋ฌธ์, 1์ ๋ฑ ํ๋๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ์ ์ 1๊ฐ๋ง์ด ์กด์ฌํ๋ค.
โ ์ด๋, 2์์ ๊ฐ์ง๊ณ 3์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํด๋ณด์.
์์ ์ฃผ์ํ ๊ฐ๋ ์ ์๊ฐํด๋ณด๋ฉด, (๋ชฉํ๊ธ์ก 3์-ํน์ ๋์ ๊ธ์ก 2์)์ธ 1์์ ๋ง๋๋ ๊ฐ ๊ฒฝ์ฐ์ ์์ (ํน์ ๋์ 2์)์ ์ฐ๋ ์ผ์ด์ค๋ง ์ถ๊ฐ๋๋ค.
๋ฐ๋ผ์ 2์์ ๊ฐ์ง๊ณ 3์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋, 1์์ ๋ง๋๋ ํ ๊ฐ์ง ๊ฒฝ์ฐ{1์}์ 2์์ด๋ผ๋ ์ผ์ด์ค๋ง์ ์ถ๊ฐํ ํ ๊ฐ์ง ๊ฒฝ์ฐ{1์, 2์}๊ฐ ๋๋ค.
โ ์กฐ๊ธ ๋ ์์ฉํ์ฌ, 2์๊ณผ 4์์ ๊ฐ์ง๊ณ 4์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํด๋ณด์.
โ๏ธ ๋จผ์ ์ ์ผ ์์ ๋์ 2์๋ถํฐ ๋ชฉํ๊ธ์ก 4์๊น์ง ๋ง๋ค์ด ๋ณธ๋ค. 2์์ ๊ฐ์ง๊ณ 2์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ 1๊ฐ์ง์ด๋ค.
โ๏ธ ๋ค์, 2์์ ๊ฐ์ง๊ณ ๋ชฉํ๊ธ์ก 3์์ ๋ง๋๋ ๊ฒฝ์ฐ๋ (3-2, 1์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์)์ (2์์ด๋ผ๋ ์ผ์ด์ค)๋ฅผ ์ถ๊ฐํ ๊ฒ์ด๋ค. 1์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ 0๊ฐ์ง์ด๋ฏ๋ก(ํ์ฌ ๊ฐ์ง๊ณ ์๋ ๋์ ์ 2์๊ณผ 4์๋ฐ์ ์๋ค), 2์์ ๊ฐ์ง๊ณ 3์์ ๋ง๋๋ ๊ฒฝ์ฐ๋ 0๊ฐ์ง์ด๋ค.
โ๏ธ ๋ค์, 2์์ ๊ฐ์ง๊ณ ๋ชฉํ๊ธ์ก 4์์ ๋ง๋๋ ๊ฒฝ์ฐ๋ (4-2, 2์์ ๋ง๋๋ ๊ฒฝ์ฐ)์ ์์ (ํน์ ๋์ 2์)์ ์ถ๊ฐํ ๊ฒ์ด๋ค. ์ต์ข 2์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ {2์} 1๊ฐ์ง์ด๋ฏ๋ก, ์ฌ๊ธฐ์ ๋ชฉํ๊ธ์ก 4์์ ๋ง๋ค๊ธฐ ์ํด ๋์ 2์์ ์ถ๊ฐํ๋ฉด (2์์ ๊ฐ์ง๊ณ 4์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์)๋ {2์, 2์} ํ ๊ฐ์ง๊ฐ ๋๋ค. ๋ฐ๋ผ์ 0์ผ๋ก ์ด๊ธฐํ ๋์ด์๋ dp[4](์ฃผ์ด์ง ๋์ ์ผ๋ก 4์์ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์)์๋ 1์ด ์ ์ฅ์ด ๋๋ค.
โ๏ธ ๋ง์ง๋ง์ผ๋ก, 4์์ ๊ฐ์ง๊ณ 4์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํด๋ณด์. (4-4, 0์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์)๋ ์๋ฌด ๋์ ๋ ์ถ๊ฐํ์ง ์์ ๊ณต์งํฉ{ } ํ ๊ฐ์ง์ด๋ค. ๋ฐ๋ผ์ 0์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์์ 4์ ๋์ ์ ์ฌ์ฉํ๋ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๋ฉด {4์} ํ ๊ฐ์ง๊ฐ ๋๋ค. ์ด๋ฅผ dp[4]์ ์ ์ฅํด์ฃผ๋ฉด dp[4]๋ 2์์ผ๋ก 4์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์ 1๊ฐ์ง, 4์์ผ๋ก 4์์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์ 1๊ฐ์ง๊ฐ ๋ํด์ ธ ์ด 2๋ผ๋ ๊ฐ์ ์ ์ฅํ๊ฒ ๋๋ค.
์์ ์ ๋ฆฌํ ๊ฐ๋ ๋ค์ ๊ฐ์ง๊ณ ์ฝ๋๋ฅผ ์ฝ์ด๋ณด๋ฉด ์ด์ ์ดํด๊ฐ ๊ฐ ๊ฒ์ด๋ค.
๐โ๏ธ ์๊ฒฌ
๋ด๊ฐ ์ซ์ดํ๋ DP ๋ฌธ์ ๋ค......
์ด๋ฒ ๋ฌธ์ ์ญ์ ๊ฐ๋ฅ์ ์ ๋ชป์ก์๋๋ฐ, ์๋ ์ฃผ์์ ํ์ด๊ฐ ๋ง์ ๋์์ด ๋๋ค.
(https://ddb8036631.github.io/boj/9084_%EB%8F%99%EC%A0%84/)
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
public class Main_๋ฐฑ์ค_9084_๋์ _๊ณจ๋V {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
StringBuilder sb = new StringBuilder();
int TC= Integer.parseInt(br.readLine());
for (int testCase = 1; testCase <= TC; testCase++) {
int N = Integer.parseInt(br.readLine()); //๋์ ์ ๊ฐ์ง ์
int[] coins = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
// 1~10000
coins[i] = Integer.parseInt(st.nextToken());
}
int M = Integer.parseInt(br.readLine()); //๋ง๋ค์ด์ผ ํ๋ ๊ธ์ก
//input
// dp[m]: m์์ ๋ง๋ค ์ ์๋ ๊ฐ์ง ์
int[] dp = new int[M+1]; //1~M
dp[0] = 1;
for (int i = 0; i < N; i++) {
int coin = coins[i];
for (int j = coin; j <= M; j++) {
dp[j] += dp[j-coin];
}
}
sb.append(dp[M]).append("\n");
}//end of testCase
System.out.println(sb);
}//end of main
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ