题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
import java.util.Scanner; fun main() { val read = Scanner(System.`in`) val res = read.nextLine().split(' ').map { it.toInt() } fun max(a1: Int, a2: Int) = Math.max(a1, a2) val bu = res[0] val m = res[1] val goods = Array(m) { Good() } for (i in 0 until m) { val tri = read.nextLine().split(' ').map { it.toInt() } val v = tri[0] val p = tri[1] val q = tri[2] goods[i].v = v goods[i].p = v * p goods[i].q = q if (q != 0) { goods[q - 1].apply { if (a1 == -1) { a1 = i } else { a2 = i } } } } val dp = Array<Int>(bu + 1) { 0 } for (i in 1..m) { val good = goods[i - 1] for (j in bu downTo 0 step 10) { if (good.isMain.not()) continue if (j >= good.v) { dp[j] = max(dp[j], dp[j - good.v] + good.p) } if (good.a1 != -1 && j >= (good.v + goods[good.a1].v)) { val a1 = goods[good.a1] dp[j] = max(dp[j], dp[j - good.v - a1.v] + good.p + a1.p) } if (good.a2 != -1 && j >= (good.v + goods[good.a2].v)) { val a2 = goods[good.a2] dp[j] = max(dp[j], dp[j - good.v - a2.v] + good.p + a2.p) } if (good.a1 != -1 && good.a2 != -1 && j >= (good.v + goods[good.a1].v + goods[good.a2].v)) { val a1 = goods[good.a1] val a2 = goods[good.a2] dp[j] = max(dp[j], dp[j - good.v - a1.v - a2.v] + good.p + a1.p + a2.p) } } } println(dp[bu]) } data class Good(var v: Int = 0, var p: Int = 0, var q: Int = 0, var a1: Int = -1, var a2: Int = -1) val Good.isMain: Boolean get() = q == 0