[白俊]2294:コイン2
質問する
https://www.acmicpc.net/problem/2294
こうぞう
理解する部分
なぜwhileゲートbfsに入る前にforゲートでk以下のコインをキューに追加するのですか?
->どうせ入っているコインの数は1個ずつ上に回るので、初めてforドアにコインを1個入れてスタート
なぜ
visited
を選んだのか->コインの数が一つずつ増えていくことに注意しましょう.
visited
の場合、インデックスが硬貨金額の合計であり、その金額が前の数字より少ない場合、0から1に更新される.このコインが総数の少ないコインに作られている場合は、より多くのコインで作る必要もなく、並ぶ必要もないので、
visited
で防ぐことができます!に答える
import sys
from collections import deque
input = sys.stdin.readline
n, k = map(int, input().split())
coins = set(int(input()) for _ in range(n))
visited = [0 for _ in range(k+1)] # 방문 시 1, 미방문 시 0
queue = deque()
for coin in coins:
if coin > k:
continue
queue.append((coin, 1)) # (현재까지의 총합, 동전 개수 총합)
visited[coin] = 1
flag = False # bfs 다 마치고 난 후에도 False이면 해당 합을 만들 수 없는 것이므로 -1 출력
while queue:
val, cnt = queue.popleft()
if val == k:
print(cnt)
flag = True
break
for coin in coins:
if val + coin > k:
continue
if visited[val + coin] == 0: # 해당 합에 한번도 방문한 적이 없을 경우 (최단 개수를 구하기 위해)
queue.append((val + coin, cnt + 1))
visited[val + coin] = 1
if not flag:
print(-1)
Reference
この問題について([白俊]2294:コイン2), 我々は、より多くの情報をここで見つけました https://velog.io/@letsbebrave/백준-2294-동전-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol