题解 | #购物单#
购物单
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);
};

查看1道真题和解析