题解 | 购物单

购物单

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);
});

全部评论

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 10:56
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务