题解 | #购物单#
购物单
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 const primary = {}; const annex = {}; const f = new Array(32000).fill(0); line = await readline(); let tokens = line.split(" "); let N = parseInt(tokens[0]); // 总钱数 let m = parseInt(tokens[1]); // 总物品数 for (let i = 1; i <= m; ++i) { let temp = await readline(); let arr = temp.split(" ").map((ele) => parseInt(ele)); if (arr[2] == 0) primary[i] = [arr[0], arr[1]]; else { // 第二个附件 if (Object.keys(annex).includes(arr[2].toString())) {//Object对象的键会自动转换为字符串类型 annex[arr[2]][1] = [arr[0], arr[1]]; } else { // 第一个附件 //初始化一个二维数组 annex[arr[2]] = new Array(2).fill(0).map(() => new Array(2).fill(0)); annex[arr[2]][0] = [arr[0], arr[1]]; } } } for (let key in primary) { //v_temp:价格,sa_temp:满意度 const v_temp = [], sa_temp = []; // 1. 只有一个 主件 v_temp.push(primary[key][0]); sa_temp.push(primary[key][0] * primary[key][1]); // 存在附件 if (key in annex) { // 2. 主件 + 附件1 v_temp.push(v_temp[0] + annex[key][0][0]); sa_temp.push(sa_temp[0] + annex[key][0][0] * annex[key][0][1]); // console.log(`annex[${key}]:${annex[key]}`); if (annex[key].length > 1) { //存在两个附件 // 2. 主件 + 附件2 v_temp.push(v_temp[0] + annex[key][1][0]); sa_temp.push(sa_temp[0] + annex[key][1][0] * annex[key][1][1]); // 3. 主件 + 附件1 + 附件2 v_temp.push(v_temp[0] + annex[key][0][0] + annex[key][1][0]); sa_temp.push( sa_temp[0] + annex[key][0][0] * annex[key][0][1] + annex[key][1][0] * annex[key][1][1] ); } } // console.log('v_temp:',v_temp); // console.log('sa_temp:',sa_temp); for (let j = N; j >= 0; j -= 10) { for (let k in v_temp) { if (j - v_temp[k] >= 0) { f[j] = Math.max(f[j], f[j - v_temp[k]] + sa_temp[k]); } } } } console.log(f[N]); })();