문제

μ€€κ·œκ°€ κ°€μ§€κ³  μžˆλŠ” 동전은 총 Nμ’…λ₯˜μ΄κ³ , 각각의 동전을 맀우 많이 κ°€μ§€κ³  μžˆλ‹€.

동전을 적절히 μ‚¬μš©ν•΄μ„œ κ·Έ κ°€μΉ˜μ˜ 합을 K둜 λ§Œλ“€λ €κ³  ν•œλ‹€. μ΄λ•Œ ν•„μš”ν•œ 동전 개수의 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 Nκ³Ό Kκ°€ μ£Όμ–΄μ§„λ‹€. (1 ≀ N ≀ 10, 1 ≀ K ≀ 100,000,000)

λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 λ™μ „μ˜ κ°€μΉ˜ Aiκ°€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ£Όμ–΄μ§„λ‹€. (1 ≀ Ai ≀ 1,000,000, A1Β = 1, iΒ β‰₯ 2인 κ²½μš°μ—Β AiλŠ” Ai-1의 배수)

좜λ ₯

첫째 쀄에 K원을 λ§Œλ“œλŠ”λ° ν•„μš”ν•œ 동전 개수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

동전 문제라고 ν•΄μ„œ μ—¬λŸ¬ κ°€κ²©μ˜ ꡬ맀 κ°€λŠ₯ν•œ λͺ¨λ“  쑰합을 μ°ΎλŠ” ν”„λ‘œκ·Έλž¨μ„ λ– μ˜¬λ ΈμŠ΅λ‹ˆλ‹€.

κ·Έ μ•Œκ³ λ¦¬μ¦˜μ—μ„œλŠ” λΉ λ₯΄κ²Œ λͺ¨λ“  0으둜 λ–¨μ–΄μ§€λŠ” 쑰합을 μ°ΎκΈ° μœ„ν•΄ λΉ„μ‹Ό 물건을 μ•žμ— 두고 μ‹Ό 물건을 λ‚˜λˆ—μ…ˆ 계산해 계산 횟수λ₯Ό μ€„μ΄μ§€λ§Œ, μ—¬κΈ°μ„œλŠ” μ΅œμ†Œ 개수의 ν™”νλ‘œ 0을 λ§Œλ“€λ©΄ λ©λ‹ˆλ‹€.

κ·Έλž˜μ„œ κ°€μž₯ λΉ„μ‹Ό 화폐λ₯Ό 뒀에 두고 λ‚˜λˆ—μ…ˆμœΌλ‘œ 계산해 첫 사둀가 λ‚˜μ˜€λ©΄ 좜λ ₯ν•˜κ³  νƒˆμΆœν•˜λ©΄ λœλ‹€κ³  μƒκ°ν•΄μ„œ 그리디λ₯Ό λ³€ν˜•ν•΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

import sys
values_length, target = map(int,input().split())
values = list(map(int,sys.stdin.readlines()))
last_node = values_length - 2
last_index = values_length - 1
node = -2
quantities=[0 for i in range(values_length)]
balances=[0 for i in range(values_length)]
is_overrun = False

while not (node == -1 and is_overrun == True):
    # quantity[n]의 μ•„μ΄ν…œ κ°œμˆ˜μ™€ λ‹¨κ°€μ˜ 곱만큼 μ˜ˆμ‚°μ—μ„œ λΉΌκ³  μž”μ•‘μ— μ €μž₯ν•©λ‹ˆλ‹€.(λ§ˆμ§€λ§‰ μ•„μ΄ν…œ μ œμ™Έ)
    balances[-1] = target
    for n in range(last_index):
        balances[n] = balances[n - 1] - (quantities[n] * values[n])
    # λ§ˆμ§€λ§‰ μ•„μ΄ν…œμ„ λͺ‡ 개 μ‚΄ 수 μžˆλŠ”μ§€ κ³„μ‚°ν•©λ‹ˆλ‹€.
    quantities[-1] = balances[-2] // values[-1]
    balances[-1] = balances[-2] - (quantities[-1] * values[-1])

    if any([i < 0 for i in balances]):
        is_overrun = True
        quantities[node] = 0
        node -= 1
    else:
        is_overrun = False
        node = last_node
        # IF Balance is $0, then save it to the case_exact
        if (balances[last_index] == 0):
            print(sum(quantities))
            break
    # PREPAIR NEXT CASE
    quantities[node] += 1

λ©λ‹ˆλ‹€.

그런데 λ°±μ€€μ—μ„œλŠ”

Untitled

μ‹œκ°„ μ΄ˆκ³Όκ°€ λœΉλ‹ˆλ‹€. λΆˆν•„μš”ν•œ λ¦¬μŠ€νŠΈκ°€ λ„ˆλ¬΄ λ§ŽμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ κ·Έλƒ₯ μ½”λ“œ μž¬ν™œμš© 없이 ν’€κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

μ–΄μ°¨ν”Ό λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§„λ‹€λŠ” 확신이 있기 λ•Œλ¬Έμ—