题解 | #购物单#

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4


import java.util.Scanner
/**
 * 主函数,用于读取输入并计算最大收益。
 * @param args 命令行参数
 */
fun main(args: Array<String>) {
      val sc = Scanner(System.`in`)
    while (sc.hasNextLine()) {
        // 初始化资金和商品数量
        var money = sc.nextInt()
        val m = sc.nextInt()
        sc.nextLine()
        // 调整资金单位为十元
        money /= 10
        // 初始化商品价格和重量数组
        val prices = Array(m + 1) { IntArray(3) }
        val weights = Array(m + 1) { IntArray(3) }
        // 遍历每个商品,读取价格和重量信息
        for (i in 1..m) {
            var a = sc.nextInt()
            var b = sc.nextInt()
            val c = sc.nextInt()
            // 调整价格单位为十元
            a /= 10 // price
            // 计算商品重量
            b *= a // weight
            // 根据商品类型,存储价格和重量
            when (c) {
                0 -> {
                    // 主件
                    prices[i][0] = a
                    weights[i][0] = b
                }

                else -> {
                    if (prices[c][1] == 0) {
                        // 附件1
                        prices[c][1] = a
                        weights[c][1] = b
                    } else {
                        // 附件2
                        prices[c][2] = a
                        weights[c][2] = b
                    }
                }
            }
            sc.nextLine()
        }
        // 初始化动态规划数组
        val dp = Array(m + 1) { IntArray(money + 1) }
        // 动态规划计算最大收益
        for (i in 1..m) {
            for (j in 1..money) {
                val a = prices[i][0]
                val b = weights[i][0]
                val c = prices[i][1]
                val d = weights[i][1]
                val e = prices[i][2]
                val f = weights[i][2]
                // 更新动态规划数组,考虑购买主件、附件1、附件2以及全部购买的情况

                dp[i][j] = if (j - a >= 0) maxOf(dp[i - 1][j], dp[i - 1][j - a] + b) else dp[i - 1][j]
                dp[i][j] = if (j - a - c >= 0) maxOf(dp[i][j], dp[i - 1][j - a - c] + b + d) else dp[i][j]
                dp[i][j] = if (j - a - e >= 0) maxOf(dp[i][j], dp[i - 1][j - a - e] + b + f) else dp[i][j]
                dp[i][j] = if (j - a - c - e >= 0) maxOf(dp[i][j], dp[i - 1][j - a - c - e] + b + d + f) else dp[i][j]
            }
        }
        // 输出最大收益
        println(dp[m][money] * 10)
    }
}

#kotlin#
全部评论

相关推荐

点赞 评论 收藏
分享
纸鹰:对他说:“你好,我是百度JAVA。”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务