题解 | 购物单
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); let cnt = 0; let totalBudget: number; let totalItems: number; let prices: number[][] = []; let weights: number[][] = []; rl.on("line", function (line: string) { const lineNum: number[] = line.split(" ").map(Number); if (cnt === 0) { // 初始化价格和重要度表 [totalBudget, totalItems] = lineNum; totalBudget /= 10; prices = Array.from({ length: totalItems + 1 }, () => [0, 0, 0]); weights = Array.from({ length: totalItems + 1 }, () => [0, 0, 0]); } else { // 填充价格和重要度表数据 const [itemPrice, itemWeight, itemParent] = lineNum; if (itemParent === 0) { // 当前物品为主件 prices[cnt][0] = itemPrice / 10; weights[cnt][0] = itemWeight; } else { if (prices[itemParent][1] === 0) { // 当前物品是否为第一个附件 prices[itemParent][1] = itemPrice / 10; weights[itemParent][1] = itemWeight; } else { prices[itemParent][2] = itemPrice / 10; weights[itemParent][2] = itemWeight; } } } cnt++; }); rl.on("close", function () { // console.log(`prices`, prices) // console.log(`weights`, weights) const dp: number[][] = []; for (let i = 0; i <= totalItems; i++) { dp[i] = new Array(totalBudget + 1).fill(0); } // 初始化 dp 数组 for (let i = 1; i <= totalItems; i++) { for (let j = 1; j <= totalBudget; j++) { const mainPrice = prices[i][0]; const mainWeight = weights[i][0]; const subPrice1 = prices[i][1]; const subWeight1 = weights[i][1]; const subPrice2 = prices[i][2]; const subWeight2 = weights[i][2]; // 是否加入当前主件 dp[i][j] = j >= mainPrice ? Math.max( dp[i - 1][j - mainPrice] + mainPrice * mainWeight, dp[i - 1][j] ) : dp[i - 1][j]; // 是否加入附件 1 dp[i][j] = j >= mainPrice + subPrice1 ? Math.max( dp[i - 1][j - mainPrice - subPrice1] + mainPrice * mainWeight + subPrice1 * subWeight1, dp[i][j] ) : dp[i][j]; dp[i][j] = j >= mainPrice + subPrice2 ? Math.max( dp[i - 1][j - mainPrice - subPrice2] + mainPrice * mainWeight + subPrice2 * subWeight2, dp[i][j] ) : dp[i][j]; dp[i][j] = j >= mainPrice + subPrice1 + subPrice2 ? Math.max( dp[i - 1][j - mainPrice - subPrice1 - subPrice2] + mainPrice * mainWeight + subPrice1 * subWeight1 + subPrice2 * subWeight2, dp[i][j] ) : dp[i][j]; // console.log(`dp[i][j]: ${i}, ${j}, ${dp[i][j]}`) } } console.log(dp[totalItems][totalBudget] * 10); });