fork download
  1. # your code goes here
  2. def solve(T):
  3. # 한정 패키지: (이름, 가격, 토큰, 제한수량)
  4. P = [
  5. ("월정액", 5900, 30, 6),
  6. ("심월보물집", 12000, 68, 1),
  7. ("봄", 4700, 24, 1),
  8. ("유리", 4700, 24, 1),
  9. ("옥구금빛", 12000, 68, 2),
  10. ("옥구울린", 12000, 68, 2),
  11. ("정찬금빛", 37000, 198, 2),
  12. ("정찬군가", 25000, 128, 2),
  13. ("현방지원", 25000, 128, 2),
  14. ]
  15. # 무제한 깡충전: (이름, 가격, 토큰)
  16. U = [
  17. ("각인60", 1200, 6),
  18. ("각인300", 5900, 30),
  19. ("각인980", 19000, 98),
  20. ("각인1980", 37000, 198),
  21. ("각인3280", 65000, 328),
  22. ("각인6480", 119000, 648),
  23. ]
  24.  
  25. # 한정 패키지를 낱개 리스트로 펼치기
  26. L = []
  27. for n, c, t, k in P:
  28. for _ in range(k):
  29. L.append((n, c, t))
  30.  
  31. INF = float("inf")
  32. dp = [INF] * (T + 1)
  33. par = [None] * (T + 1) # 백트래킹용 기록장
  34. dp[0] = 0
  35.  
  36. # 1. 한정 패키지 (중복 방지를 위해 역방향 순회)
  37. for n, c, t in L:
  38. for w in range(T, -1, -1):
  39. if dp[w] != INF:
  40. nxt = min(T, w + t)
  41. if dp[w] + c < dp[nxt]:
  42. dp[nxt] = dp[w] + c
  43. par[nxt] = (w, n, c, t)
  44.  
  45. # 2. 무제한 깡충전 (중복 구매 가능하므로 정방향 순회)
  46. for n, c, t in U:
  47. for w in range(T + 1):
  48. if dp[w] != INF:
  49. nxt = min(T, w + t)
  50. if dp[w] + c < dp[nxt]:
  51. dp[nxt] = dp[w] + c
  52. par[nxt] = (w, n, c, t)
  53.  
  54. # 3. 백트래킹으로 구매 리스트 복원
  55. path = []
  56. cur = T
  57. while cur > 0 and par[cur]:
  58. pw, n, c, t = par[cur]
  59. path.append((n, c, t))
  60. cur = pw
  61.  
  62. return dp[T], path[::-1]
  63.  
  64.  
  65. # 실행 결과 출력
  66. for T in [980, 1600, 2200]:
  67. cost, ans = solve(T)
  68. print(f"[{T} 토큰] 최소비용: {cost:,}원")
  69. for n, c, t in ans:
  70. print(f" - {n}: {c:,}원 ({t}t)")
  71. print()
Success #stdin #stdout 0.08s 14104KB
stdin
Standard input is empty
stdout
[980 토큰] 최소비용: 178,800원
  - 월정액: 5,900원 (30t)
  - 월정액: 5,900원 (30t)
  - 심월보물집: 12,000원 (68t)
  - 옥구금빛: 12,000원 (68t)
  - 옥구금빛: 12,000원 (68t)
  - 옥구울린: 12,000원 (68t)
  - 각인6480: 119,000원 (648t)

[1600 토큰] 최소비용: 293,100원
  - 월정액: 5,900원 (30t)
  - 심월보물집: 12,000원 (68t)
  - 옥구금빛: 12,000원 (68t)
  - 옥구금빛: 12,000원 (68t)
  - 옥구울린: 12,000원 (68t)
  - 각인60: 1,200원 (6t)
  - 각인6480: 119,000원 (648t)
  - 각인6480: 119,000원 (648t)

[2200 토큰] 최소비용: 403,600원
  - 월정액: 5,900원 (30t)
  - 심월보물집: 12,000원 (68t)
  - 봄: 4,700원 (24t)
  - 옥구금빛: 12,000원 (68t)
  - 옥구금빛: 12,000원 (68t)
  - 각인6480: 119,000원 (648t)
  - 각인6480: 119,000원 (648t)
  - 각인6480: 119,000원 (648t)