Skip to content

Conversation

@dohyeondol1
Copy link
Contributor

@dohyeondol1 dohyeondol1 commented May 6, 2025

πŸ”— 문제 링크

동전 1

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

1μ‹œκ°„

✨ μˆ˜λ„ μ½”λ“œ

μ €λ²ˆ 동전 0 이 합이 kκ°€ λ˜λŠ” 동전 개수의 μ΅œμ†Ÿκ°’μ΄μ—ˆλ‹€λ©΄,
이번 λ¬Έμ œλŠ” 합이 kκ°€ λ˜λŠ” 동전 개수의 경우의 수λ₯Ό ꡬ해야 ν•©λ‹ˆλ‹€.

μ„€λͺ…ν•˜κΈ°μ— μ•žμ„œ,
κ΅¬ν•˜κ³ μž ν•˜λŠ” κ°€μΉ˜ 합이 0인 경우, 아무 동전도 μ„ νƒν•˜μ§€ μ•ŠλŠ” 경우 ν•˜λ‚˜κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.
λ”°λΌμ„œ 0은 항상 1의 값을 κ°€μ§‘λ‹ˆλ‹€. μ €λŠ” 이 뢀뢄을 생각 λͺ»ν•΄μ„œ μ‹œκ°„μ΄ 더 κ±Έλ ΈμŠ΅λ‹ˆλ‹€ γ…Ž

문제의 예제 μž…λ ₯ 1κ³Ό 같이, λ™μ „μ˜ κ°€μΉ˜λ₯Ό 1, 2, 5둜 μ„€μ •ν•˜κ³  문제λ₯Ό λ°”λΌλ΄…μ‹œλ‹€.
편의λ₯Ό μœ„ν•΄μ„œ λ™μ „μ˜ κ°€μΉ˜λ₯Ό 원(KRW, β‚©)으둜 μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 ν‘œμ—μ„œ μ‹œμž‘ν•΄λ΄…μ‹œλ‹€.
λ™μ „μ˜ κ°€μΉ˜κ°€ μ£Όμ–΄μ§€μ§€ μ•Šμ€ 경우 0λΆ€ν„° 10κΉŒμ§€μ˜ κ°€μΉ˜ν•©μ„ ν‘œν˜„ν•  수 μžˆλŠ” 경우의 수 ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.
이λ₯Ό κ°€μΉ˜ i에 λ”°λ₯Έ dp[i]라고 μ„€μ •ν•΄λ†“κ² μŠ΅λ‹ˆλ‹€.

0 1 2 3 4 5 6 7 8 9 10
1 0 0 0 0 0 0 0 0 0 0

λ¨Όμ € 1μ›λ§Œ μžˆλŠ” 경우 0λΆ€ν„° 10κΉŒμ§€μ˜ κ°€μΉ˜ν•©μ„ ν‘œν˜„ν•  수 μžˆλŠ” 경우의 μˆ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

0 1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 1 1 1 1 1

그리고 2μ›λ§Œ μžˆλŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

0 1 2 3 4 5 6 7 8 9 10
1 0 1 0 1 0 1 0 1 0 1

1원과 2원이 λ‘˜ λ‹€ μžˆλŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

0 1 2 3 4 5 6 7 8 9 10
1 1 2 2 3 3 4 4 5 5 6

μˆ˜κ°€ μ–΄λ–€ κ·œμΉ™μ„±μ΄ μžˆλŠ”κ²ƒλ§Œ κ°™μ£ ..?
ꡳ이 ꡳ이 μ—¬κΈ°μ„œ κ·œμΉ™μ„±μ„ 찾아보면, λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 1μ›λ§Œ μžˆλŠ” 경우 : $\text{dp[i]} = \text{dp[i]}+\text{dp[i-1]}$
  • 2μ›λ§Œ μžˆλŠ” 경우 : $\text{dp[i]} = \text{dp[i]}+\text{dp[i-2]}$

1원과 2원이 λ‘˜ λ‹€ μžˆλŠ” κ²½μš°λŠ” κ·œμΉ™μ„±μ΄ μžˆλŠ” 것 κ°™μ§€λ§Œ,
λ…λ¦½μ μœΌλ‘œ 바라보면 μ•žμ„œ κ΅¬ν•œ κ·œμΉ™μ„±κ³Ό μ „ν˜€ λ‹€λ₯Έ 식이 λ‚˜μ˜€κ²Œ λ©λ‹ˆλ‹€.

$\text{dp[i]} = \left\lfloor \frac{\text{i}}{2} \right\rfloor + 1$

κ²°κ΅­ λ¬Έμ œμ—μ„œ λ™μ „μ˜ κ°€μΉ˜κ°€ μ£Όμ–΄μ§€κ³  이λ₯Ό μ΄μš©ν•΄ κ·œμΉ™μ„±μ΄ 생겨야 ν•˜κΈ° λ•Œλ¬Έμ—,
1원과 2원이 λ™μ‹œμ— μžˆλŠ” κ²½μš°λŠ”
$\text{dp[i]} = \text{dp[i]}+\text{dp[i-1]}$ 이 μ„ ν–‰λ˜κ³ ,
$\text{dp[i]} = \text{dp[i]}+\text{dp[i-2]}$ 이 κ³„μ‚°λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ΄λŠ” λ™μ „μ˜ κ°€μΉ˜λ₯Ό coin[j]라고 ν–ˆμ„ λ•Œ, λ‹€μŒκ³Ό 같이 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

for(int i = 0; i < n; i++)
	for(int j = coin[i]; j <= k; j++)
		dp[j] += dp[j - coin[i]];

이λ₯Ό κ²€μ¦ν•˜κΈ° μœ„ν•΄μ„œ, 아직 μ‚¬μš©ν•˜μ§€ μ•Šμ€ 5μ›μ§œλ¦¬ 동전을 μΆ”κ°€ν•΄λ΄…μ‹œλ‹€.

5μ›λ§Œ μžˆλŠ” 경우 0λΆ€ν„° 10κΉŒμ§€μ˜ κ°€μΉ˜ν•©μ„ ν‘œν˜„ν•  수 μžˆλŠ” 경우의 μˆ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

0 1 2 3 4 5 6 7 8 9 10
1 0 0 0 0 1 0 0 0 0 1

이제 1원, 2원, 5원이 λͺ¨λ‘ μžˆλŠ” 경우의 수λ₯Ό μœ„μ—μ„œ κ΅¬ν•œ κ·œμΉ™μ„±μ„ 톡해 ν•˜λ‚˜ν•˜λ‚˜ 식을 ꡬ해보면, λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

κ°€μ •ν•œ κ·œμΉ™μ„±μ„ μ μš©ν•΄ 1,2,5μ›μ˜ 동전이 μžˆλŠ” 경우 κ°€μΉ˜ν•© 0λΆ€ν„° 10κΉŒμ§€μ˜ 경우의 수λ₯Ό κ³„μ‚°ν•œ κ³Όμ •

  • $\text{dp}[0] = 1$ κ°€μ •

  • λ™μ „μ˜ κ°€μΉ˜ = 1
    $\text{dp}[1] \quad \text{+=} \quad \text{dp}[0] = 1 $
    $\text{dp}[2] \quad \text{+=} \quad \text{dp}[1] = 1 $
    $\text{dp}[3] \quad \text{+=} \quad \text{dp}[2] = 1 $
    $\text{dp}[4] \quad \text{+=} \quad \text{dp}[3] = 1 $
    $\text{dp}[5] \quad \text{+=} \quad \text{dp}[4] = 1 $
    $\text{dp}[6] \quad \text{+=} \quad \text{dp}[5] = 1 $
    $\text{dp}[7] \quad \text{+=} \quad \text{dp}[6] = 1 $
    $\text{dp}[8] \quad \text{+=} \quad \text{dp}[7] = 1 $
    $\text{dp}[9] \quad \text{+=} \quad \text{dp}[8] = 1 $
    $\text{dp}[10] \quad \text{+=} \quad \text{dp}[9] = 1 $

  • λ™μ „μ˜ κ°€μΉ˜ = 2
    $\text{dp}[2] \quad \text{+=} \quad \text{dp}[0] = 2 $
    $\text{dp}[3] \quad \text{+=} \quad \text{dp}[1] = 2 $
    $\text{dp}[4] \quad \text{+=} \quad \text{dp}[2] = 3 $
    $\text{dp}[5] \quad \text{+=} \quad \text{dp}[3] = 3 $
    $\text{dp}[6] \quad \text{+=} \quad \text{dp}[4] = 4 $
    $\text{dp}[7] \quad \text{+=} \quad \text{dp}[5] = 4 $
    $\text{dp}[8] \quad \text{+=} \quad \text{dp}[6] = 5 $
    $\text{dp}[9] \quad \text{+=} \quad \text{dp}[7] = 5 $
    $\text{dp}[10] \quad \text{+=} \quad \text{dp}[8] = 6 $

  • λ™μ „μ˜ κ°€μΉ˜ = 5
    $\text{dp}[5] \quad \text{+=} \quad \text{dp}[0] = 4 $
    $\text{dp}[6] \quad \text{+=} \quad \text{dp}[1] = 5 $
    $\text{dp}[7] \quad \text{+=} \quad \text{dp}[2] = 6 $
    $\text{dp}[8] \quad \text{+=} \quad \text{dp}[3] = 7 $
    $\text{dp}[9] \quad \text{+=} \quad \text{dp}[4] = 8 $
    $\text{dp}[10] \quad \text{+=} \quad \text{dp}[5] = 10 $

λ”°λΌμ„œ λ‹€μŒκ³Ό 같은 κ²°κ³Όλ₯Ό ν…Œμ΄λΈ”λ‘œ ν‘œν˜„ν•  수 μžˆμ”λ‹ˆλ‹·...

0 1 2 3 4 5 6 7 8 9 10
1 1 2 2 3 4 5 6 7 8 10

μ΄λŠ” μ‹€μ œ 0λΆ€ν„° 10κΉŒμ§€μ˜ κ°€μΉ˜ν•©μ„ ν‘œν˜„ν•˜λŠ” 경우의 μˆ˜μ™€ λ™μΌν•˜λ©°,
이 점화식을 μ΄μš©ν•œ ν’€μ΄λ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μˆ˜λ„ μ½”λ“œ
int main() {
	λ™μ „μ˜ 개수 n, κ΅¬ν•˜λŠ” κ°€μΉ˜ν•© k μž…λ ₯
	각 λ™μ „μ˜ κ°€μΉ˜λ₯Ό μ €μž₯ν•  λ°°μ—΄ coin μ„ μ–Έ
	각 κ°€μΉ˜ν•©μ„ κ΅¬ν•˜λŠ” 경우의 수λ₯Ό μ €μž₯ν•  λ°°μ—΄ dp μ„ μ–Έ
	coin 배열을 순회:
		각 동전 κ°€μΉ˜ μž…λ ₯

	κ°€μΉ˜ν•©μ΄ 0인 경우 1 μ €μž₯
	iλŠ” 0λΆ€ν„° nκΉŒμ§€ 반볡:
		jλŠ” coin[i] λΆ€ν„° kκΉŒμ§€ 반볡: 
			dp[j]에 dp[j - coin[i]] λ§ŒνΌμ„ μ „λΆ€ λ”ν•˜κΈ°

	κ°€μΉ˜ν•©μ΄ kκ°€ λ˜λŠ” 경우의 수 좜λ ₯
}

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

@froglike6
Copy link
Collaborator

μ„€λͺ…을 잘 ν•΄μ£Όμ…”μ„œ, μ„€λͺ…λ§Œ 보고 문제λ₯Ό ν’€ 수 μžˆμ„ μ •λ„μž…λ‹ˆλ‹€ γ…Žγ…Ž
저도 같은 λ°©λ²•μœΌλ‘œ 파이썬으둜 문제λ₯Ό ν•΄κ²°ν•΄λ΄€μŠ΅λ‹ˆλ‹€.
μ΄λŸ¬ν•œ 문제λ₯Ό Unbounded Knapsack라고도 ν•œλ‹€λ„€μš”. 갯수 μ œν•œμ—†λŠ” λ°°λ‚­ 문제라고 ν•©λ‹ˆλ‹€.

import sys
input = sys.stdin.readline

n, k = map(int, input().split())
coins = [int(input()) for _ in range(n)]

dp = [0 for _ in range(k+1)]
dp[0] = 1

for coin in coins:
    for j in range(coin, k + 1):
        dp[j] += dp[j - coin]

print(dp[k])

Copy link
Collaborator

@hadongun hadongun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

으..μ–΄ 아직 dpλ¬Έμ œμ— μ΅μˆ™ν•˜μ§€ μ•Šμ•„μ„œ 이것저것 μ¨λ³΄λ©΄μ„œ 해도 잘 λͺ¨λ₯΄κ² λ„€μš©
μ„€λͺ… μžμ„Ένžˆ 써 μ£Όμ…”μ„œ 쀑간에 힌트λ₯Ό μ–»κ³  κΎΈμ—­κΎΈμ—­ 파이썬으둜 ν’€μ–΄λƒˆμŠ΅λ‹ˆλ‹΅..!

dp 볼수둝 λ§€λ ₯μ μ΄κ΅°μš”. 쑰금 더 μ΅μˆ™ν•΄μ Έλ³΄κ² μŠ΅λ‹ˆλ‹€

동전1

n, k = map(int, input().split())
coin = []
for _ in range(n):
    coin.append(int(input()))

dp = [0] * (k + 1)
dp[0] = 1

for i in range(n):
    for j in range(coin[i], k + 1):
        dp[j] = dp[j] + dp[j - coin[i]]

print(dp[k])

Copy link
Collaborator

@caucsejunseo caucsejunseo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ν‘œλ‘œ μ£Όμ‹œλ‹ˆ μ΄ν•΄ν•˜κΈ° νŽΈν–ˆμŠ΅λ‹ˆλ‹€! 경우의 수λ₯Ό λ‚˜λˆ„λŠ”κ²Œ 1,2,3 λ§Œλ“€κΈ° λ¬Έμ œλž‘ λΉ„μŠ·ν•œ λŠλ‚ŒμΈ κ±° κ°™μ•„μš”. 이제 dp에 μ’€ μ΅μˆ™ν•΄μ§€λŠ” κ±° κ°™μŠ΅λ‹ˆλ‹€

동전1

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

int main()
{
    int n, k;
    scanf("%d %d", &n, &k);

    int* coin = (int*)malloc(sizeof(int) * n);
    int* dp = (int*)malloc(sizeof(int) * (k + 1));


    for (int i = 0; i < n; i++)
    {
        scanf("%d", &coin[i]);
    }

    memset(dp, 0, sizeof(int) * (k + 1));
    dp[0] = 1;


    for (int i = 0; i < n; i++)
    {
        for (int j = coin[i]; j < k + 1; j++)
        {
            dp[j] = dp[j] + dp[j - coin[i]];
        }
    }

    printf("%d", dp[k]);

    return 0;
}

@dohyeondol1 dohyeondol1 merged commit f77d96b into main May 12, 2025
@dohyeondol1 dohyeondol1 deleted the 11-dohyeondol1 branch May 24, 2025 14:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants