题解 | #购物单#
购物单
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#
腾讯成长空间 5983人发布
查看1道真题和解析