fork download
  1. solve <- function(v, S)
  2. {
  3. f <- function(s)
  4. {
  5. if (s < 0) return(Inf)
  6. if (s == 0) return(0)
  7. ifelse(N[s], N[s], N[s] <<- min(Vectorize(f)(s - v)) + 1)
  8. }
  9.  
  10. N <- rep(0, S)
  11. ifelse((n <- f(S)) == Inf, -1, n)
  12. }
  13.  
  14. printf <- function(...) cat(sprintf(...))
  15.  
  16. for (v in list(c(1, 7, 10), c(3, 7, 10))) {
  17. printf("硬貨が[%s]のとき\n", toString(v))
  18. printf(" 金額 → 使用枚数\n")
  19. for (S in 1:20) printf(" %d → %d\n", S, solve(v, S))
  20. printf("\n")
  21. }
Success #stdin #stdout 0.39s 41796KB
stdin
Standard input is empty
stdout
硬貨が[1, 7, 10]のとき
 金額 → 使用枚数
 1 → 1
 2 → 2
 3 → 3
 4 → 4
 5 → 5
 6 → 6
 7 → 1
 8 → 2
 9 → 3
 10 → 1
 11 → 2
 12 → 3
 13 → 4
 14 → 2
 15 → 3
 16 → 4
 17 → 2
 18 → 3
 19 → 4
 20 → 2

硬貨が[3, 7, 10]のとき
 金額 → 使用枚数
 1 → -1
 2 → -1
 3 → 1
 4 → -1
 5 → -1
 6 → 2
 7 → 1
 8 → -1
 9 → 3
 10 → 1
 11 → -1
 12 → 4
 13 → 2
 14 → 2
 15 → 5
 16 → 3
 17 → 2
 18 → 6
 19 → 4
 20 → 2