2293.コイン1


質問する


白駿2293号硬貨1

に答える


考えもせずにdfsで解決した.間違いなくRecursionErrorを受けた.
今はdfsのトラウマを起こしたい.
def dfs(L, val):
  global cnt
  if val == k: 
      cnt += 1
  if val > k or val+coins[L] > k: return
  else:
      for i in range(L, len(coins)):
          dfs(i, val + coins[i])
        
if __name__ == '__main__':
  n, k = map(int, input().split())
  coins = [int(input()) for _ in range(n)]
  cnt = 0
  dfs(0, 0)
  print(cnt)
  
どうしても方法がわからないので、アルゴリズムの分類を見ました.ダイナミックプログラミングです...
動的な配置は、次のように求めることができます.

スペース効率を向上させるために、更新には2 Dリストではなく1 Dリストが使用されます.
n, k = map(int, input().split())
coins = [int(input()) for _ in range(n)]
dy = [0] * (k+1)
for c in coins:
    for i in range(c, k+1):
        dy[i] = dy[i] + dy[i-c] if i-c > 0 else dy[i] + 1
print(dy[k])

足りないところ


これは基本的な問題ですが、アルゴリズム全体では真実ではありません.
基本アルゴリズムを習得するためには,繰り返し実現することによって習得する必要がある.