题解 | #购物单#

购物单

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

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
let sum = 0;
let num = 0;
let i = 0;
const goods = [];
const base = 10;
void (async function () {
    // Write your code here
    while ((line = await readline())) {
        if (!num) {
            [sum, num] = line.split(" ").map(Number);
            sum = sum / base;
        } else {
            if (i < num) {
                // console.log( i, num);
                makeArr(line, i);
                i++;
            } 
            if (i === num) {
                // console.log(goods,  i, num);
                fun(goods, sum);
            }
        }
    }
})();

const makeArr = (line, i) => {
    let [w, v, q] = line.split(" ").map(Number);
    w = w / base;
    v = v * w;
    if (q) {
        // 附件
        // goods[q - 1] = goods[q - 1] || [];
        if (!goods[q - 1]) {
            goods[q - 1] = { children: [], v: 0, w: 0 };
        }
        if (!goods[q - 1].children) {
            goods[q - 1].children = [];
        }
        goods[q - 1].children.push({ w, v });
    } else {
        // 主件
        if (!goods[i]) {
            goods[i] = {};
        }
        goods[i].v = v;
        goods[i].w = w;
        if (!goods[i].children) {
            goods[i].children = [];
        }
    }
};

const transArr = (arr) => {
    let wArr = [];
    let vArr = [];
    arr.forEach((item) => {
        // console.log(item);
        let tW = [];
        let tV = [];
        let cw = 0;
        let cv = 0;
        tW.push(item.w);
        tV.push(item.v);
        item.children.forEach((it) => {
            tW.push(it.w + item.w);
            tV.push(it.v + item.v);
            cw += it.w;
            cv += it.v;
        });
        if (cw > 0) {
            tW.push(cw + item.w);
            tV.push(cv + item.v);
        }
        wArr.push(tW);
        vArr.push(tV);
    });
    return { w: wArr, v: vArr };
};

const fun = (arr, total) => {
    const { w, v } = transArr(arr);
    // console.log("w:", w);
    // console.log("v:", v);
    let len = w.length;
    // const dp1 = new Array(total + 1).fill(0);
    // for (let i = 0; i < len; i++) {
    //     for (let j = total; j >= 0; j--) {
    //         let max = dp1[j];
    //         for (let k = 0; k < w[i].length; k++) {
    //             if (j >= w[i][k]) {
    //                 max = Math.max(max, dp1[j - w[i][k]] + v[i][k]);
    //             }
    //         }
    //         dp1[j] = max;
    //     }
    // }
    // console.log(dp1[total] * base);
    // return;
    const dp = [[]];

    for (let i = 0; i <= len; i++) {
        dp[i] = new Array(total + 1).fill(0);
    }
    for (let i = 0; i< len; i++ ) {
        for( let j = 0; j <= total; j++) {
            let max = dp[i][j];
            for (let k = 0; k< w[i].length; k++) {
                let wi = w[i][k];
                if (j >= wi ) {
                    max = Math.max(max, dp[i][j - wi] + v[i][k])
                } 
            }
            dp[i+1][j]= max;
        }
    }
    console.log(dp[len][total] * base);
};

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务