こんにちは、ナナオです。

前回に引き続き競プロを実施していきたいと思います。

今回の問題は以下です。

【最安値】最安値を達成するには 4 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

以下のように実装しました。

package main
import "fmt"
func main(){
    var n, x, a, y, b, z, c int
    fmt.Scan(&n, &x, &a, &y, &b, &z, &c)
    dp := make([]int, n + z)
    min := func(a, b int) int {
        if a < b {
            return a
        } else {
            return b
        }
    }
    for i := 1; i < n + z; i++ {
        dp[i] = 1000000
    }
    for i := 0; i < n + z; i++ {
        if i >= x {
            dp[i] = min(dp[i], dp[i - x] + a)
        }
        if i >= y {
            dp[i] = min(dp[i], dp[i - y] + b)
        }
        if i >= z {
            dp[i] = min(dp[i], dp[i - z] + c)
        }
    }
    for i := n + z- 2; i > 0; i-- {
        dp[i] = min(dp[i], dp[i + 1])
    }
    fmt.Println(dp[n])
}

ただまだなぜこれで動くのかをちゃんと理解できていないので、繰り返しで学習しようと思います。

ということで今回はこれで👍