题解 | #购物单#

购物单

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

全部评论

相关推荐

这个简历还有救吗,考研失利了,完蛋蛋了
helloWord大...:每次看见你们9爷隔着嚷嚷找不到工作,我真的分不清是串还是装
点赞 评论 收藏
分享
03-04 15:02
已编辑
南京大学 Java
3.3&nbsp;一面岗位:&nbsp;后台开发部门:&nbsp;腾讯云场景题偏多,没问项目,没手撕,时长半小时1.&nbsp;自我介绍2.&nbsp;Java基础:-&nbsp;Treemap&nbsp;&amp;&nbsp;HashMap区别-&nbsp;ArrayList,&nbsp;添加n个数(n较大),会发生什么(应该是想问ArrayList的扩容机制)-&nbsp;考虑扩容的情况下这个过程的复杂度多少(说明复杂度计算思路即可,不需要给出具体的复杂度)3.&nbsp;并发:-&nbsp;项目里怎么用多线程的(一开始答了具体场景,不过面试官想听的是线程池,Synchronized这些...)-&nbsp;volatile&nbsp;&amp;&nbsp;synchronized-&nbsp;这里还问了一个,不过忘了...-&nbsp;假设项目里用了很多synchronized拖慢了系统效率,让你重构项目,你怎么设计?&nbsp;(真不会,回了一个参考乐观锁的设计用版本号之类的,然后这个话题就过了)4.&nbsp;JVM-&nbsp;JVM垃圾回收,怎么判断对象有没有被引用?&nbsp;(可达性分析)-&nbsp;GC&nbsp;Root有哪些-&nbsp;遇到OOM怎么排查5.&nbsp;场景-&nbsp;设计一个数据结构,用于在搜索框中搜索人名(不知道是不是这个意思,答了字典树这个结构)-&nbsp;使用字典树存储的话空间复杂度是多少(同前面,给出计算思路就行,不需要具体的值)-&nbsp;问了下简历上项目的背景,项目的具体内容没问-&nbsp;项目里的难点/印象深刻的点,咋解决的-&nbsp;针对上一点提了一个发散性的场景题(让你设计个xxx,你的思路)然后反问,无手撕。---春招第一面,被场景设计问题拷打麻了,就当练习了,不敢奢望能过,后续随缘了3.4更新,已挂
_追梦旅人_:大家考虑深圳睿联不,我们正在春招,可在我主页看岗位,感兴趣可直接投递~
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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