题解 | #购物单#
购物单
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;
void (async function () {
// Write your code here
while ((line = await readline())) {
let linearr = line.split(" ").map(Number);
let w = linearr[0];
let alldata = [];
let f = [[]];
for (let i = 0; i < linearr[1]; i++) {
while ((line2 = await readline())) {
let val = line2.split(" ").map(Number);
alldata.push({
price: val[0],
importance: val[1],
parents: val[2],
childrens: [],
});
}
}
for (let i = 0; i < alldata.length; i++) {
if (alldata[i].parents > 0) {
alldata[alldata[i].parents - 1].childrens.push(alldata[i]);
}
}
let usedata = [];
for (let i of alldata) {
if (i.parents == 0) {
usedata.push(i);
}
}
for (let i in usedata) {
usedata[i].childrens.sort((a, b) => {
return a.price - b.price;
});
}
let n = usedata.length;
for (let i = 0; i <= w; i += 10) {
if (i < usedata[0].price) {
f[0][i / 10] = 0;
} else if (usedata[0].childrens.length == 0) {
f[0][i / 10] = usedata[0].price * usedata[0].importance;
} else {
if (
i >= usedata[0].price &&
i < usedata[0].childrens[0].price + usedata[0].price
) {
f[0][i / 10] = usedata[0].price * usedata[0].importance;
} else if (
usedata[0].childrens[1] &&
i >= usedata[0].childrens[0].price + usedata[0].price &&
i < usedata[0].price + usedata[0].childrens[1].price
) {
f[0][i / 10] =
usedata[0].price * usedata[0].importance +
usedata[0].childrens[0].price *
usedata[0].childrens[0].importance;
} else if (
usedata[0].childrens[1] &&
i <
usedata[0].childrens[1].price +
usedata[0].price +
usedata[0].childrens[0].price &&
i >= usedata[0].price + usedata[0].childrens[1].price
) {
let one =
usedata[0].price * usedata[0].importance +
usedata[0].childrens[0].price *
usedata[0].childrens[0].importance;
let two =
usedata[0].price * usedata[0].importance +
usedata[0].childrens[1].price *
usedata[0].childrens[1].importance;
f[0][i / 10] = Math.max(one, two);
} else if (
usedata[0].childrens[1] &&
i >=
usedata[0].childrens[0].price +
usedata[0].price +
usedata[0].childrens[1].price
) {
f[0][i / 10] =
usedata[0].price * usedata[0].importance +
usedata[0].childrens[0].price *
usedata[0].childrens[0].importance +
usedata[0].childrens[1].price *
usedata[0].childrens[1].importance;
} else {
f[0][i / 10] =
usedata[0].price * usedata[0].importance +
usedata[0].childrens[0].price *
usedata[0].childrens[0].importance;
}
}
}
for (let i = 0; i <= w; i += 10) {
for (let j = 1; j < n; j++) {
if (!f[j]) f.push([]);
if (i < usedata[j].price) {
f[j][i / 10] = f[j - 1][i / 10];
} else if (usedata[j].childrens.length == 0) {
f[j][i / 10] = Math.max(
f[j - 1][i / 10],
usedata[j].price * usedata[j].importance +
f[j - 1][(i - usedata[j].price) / 10]
);
} else {
if (
i >= usedata[j].price &&
i < usedata[j].childrens[0].price + usedata[j].price
) {
f[j][i / 10] = Math.max(
f[j - 1][i / 10],
usedata[j].price * usedata[j].importance +
f[j - 1][(i - usedata[j].price) / 10]
);
} else if (
usedata[j].childrens[1] &&
i >= usedata[j].childrens[0].price + usedata[j].price &&
i < usedata[j].price + usedata[j].childrens[1].price
) {
f[j][i / 10] = Math.max(
f[j - 1][i / 10],
usedata[j].price * usedata[j].importance +
usedata[j].childrens[0].price *
usedata[j].childrens[0].importance +
f[j - 1][
(i -
usedata[j].price -
usedata[j].childrens[0].price) /
10
],
usedata[j].price * usedata[j].importance +
f[j - 1][(i - usedata[j].price) / 10]
);
} else if (
usedata[j].childrens[1] &&
i <
usedata[j].childrens[0].price +
usedata[j].price +
usedata[j].childrens[1].price &&
i >= usedata[0].price + usedata[j].childrens[1].price
) {
let one =
usedata[j].price * usedata[j].importance +
usedata[j].childrens[0].price *
usedata[j].childrens[0].importance +
f[j - 1][
(i -
usedata[j].price -
usedata[j].childrens[0].price) /
10
];
let two =
usedata[j].price * usedata[j].importance +
usedata[j].childrens[1].price *
usedata[j].childrens[1].importance +
f[j - 1][
(i -
usedata[j].price -
usedata[j].childrens[1].price) /
10
];
let three =
usedata[j].price * usedata[j].importance +
f[j - 1][(i - usedata[j].price) / 10];
f[j][i / 10] = Math.max(
f[j - 1][i / 10],
one,
two,
three
);
} else if (
usedata[j].childrens[1] &&
i >=
usedata[j].childrens[0].price +
usedata[j].price +
usedata[j].childrens[1].price
) {
let one =
usedata[j].price * usedata[j].importance +
usedata[j].childrens[0].price *
usedata[j].childrens[0].importance +
usedata[j].childrens[1].price *
usedata[j].childrens[1].importance +
f[j - 1][
(i -
usedata[j].price -
usedata[j].childrens[0].price -
usedata[j].childrens[1].price) /
10
];
let two =
usedata[j].price * usedata[j].importance +
f[j - 1][(i - usedata[j].price) / 10];
let three =
usedata[j].price * usedata[j].importance +
usedata[j].childrens[0].price *
usedata[j].childrens[0].importance +
f[j - 1][
(i -
usedata[j].price -
usedata[j].childrens[0].price) /
10
];
let four =
usedata[j].price * usedata[j].importance +
usedata[j].childrens[1].price *
usedata[j].childrens[1].importance +
f[j - 1][
(i -
usedata[j].price -
usedata[j].childrens[1].price) /
10
];
f[j][i / 10] = Math.max(
f[j - 1][i / 10],
one,
two,
three,
four
);
} else {
//f[j][i/10] = Math.max(f[j-1][i/10], usedata[j].price*usedata[j].importance + f[j-1][(i - usedata[j].price-usedata[j].childrens[0].price)/10]);
let one =
usedata[j].price * usedata[j].importance +
f[j - 1][(i - usedata[j].price) / 10];
let two =
usedata[j].price * usedata[j].importance +
usedata[j].childrens[0].price *
usedata[j].childrens[0].importance +
f[j - 1][
(i -
usedata[j].price -
usedata[j].childrens[0].price) /
10
];
f[j][i / 10] = Math.max(f[j - 1][i / 10], one, two);
}
}
}
}
console.log(f[n - 1][w / 10]);
}
})();