描述
王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
主件 | 附件 |
电脑 | 打印机,扫描仪 |
书柜 | 图书 |
书桌 | 台灯,文具 |
工作椅 | 无 |
输入描述:
输入的第 1 行,为两个正整数N,m,用一个空格隔开:
(其中 N ( N<32000 )表示总钱数, m (m <60 )为可购买的物品的个数。)
从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整数 v p q
(其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 ~ 5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号)
输出描述:
输出一个正整数,为张强可以获得的最大的满意度。
示例1
输入:
1000 5 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0
输出:
2200
示例2
输入:
50 5 20 3 5 20 3 5 10 3 0 10 2 0 10 1 0
输出:
130
说明:
由第1行可知总钱数N为50以及希望购买的物品个数m为5; 第2和第3行的q为5,说明它们都是编号为5的物品的附件; 第4~6行的q都为0,说明它们都是主件,它们的编号依次为3~5; 所以物品的价格与重要度乘积的总和的最大值为10*1+20*3+20*3=130
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
let m = 0
let n = 0
let lists = []
while(line = await readline()){
if(m === 0){
[m,n] = line.split(' ').map(Number)
m/=10
}else{
lists.push(new Item(line.split(' ').map(Number)))
}
}
lists.forEach((item)=>{
if(item.q>0){
lists[item.q-1].addChild(item)
}
})
lists=lists.filter((item)=>{return item.q===0})
const res = bag(lists,m)
console.log(res[lists.length][m]*10)
// console.log(res[7][270]*10)
}()
function bag(lists,m){
let res = []
res[0] = new Array(m+1).fill(0)
for(let i=0;i<lists.length;i++){
res[i+1] = new Array(m+1).fill(0)
for(let j=0;j<=m;j++){
let r = res[i][j]
if(lists[i].v<=j){
r = Math.max(r,lists[i].vp+res[i][j-lists[i].v])
if(lists[i].children[0]){
const v1 = lists[i].v+lists[i].children[0].v
if(v1<=j){
r=Math.max(r,lists[i].vp+lists[i].children[0].vp+res[i][j-v1])
}
if(lists[i].children[1]){
const v2=lists[i].v+lists[i].children[1].v
if(v2<=j){
r=Math.max(r,lists[i].vp+lists[i].children[1].vp+res[i][j-v2])
}
const v3=v1+lists[i].children[1].v
if(v3<=j){
r=Math.max(r,lists[i].vp+lists[i].children[0].vp+lists[i].children[1].vp+res[i][j-v3])
}
}
}
//如果赋值放在里面会有错误
// res[i+1][j]=r
// if(i===6&j===270){
// console.log(r)
// }
}
// 正确的赋值位置
res[i+1][j]=r
}
}
return res
}
class Item{
constructor(input){
this.v = input[0]/10
this.p = input[1]
this.q = input[2]
this.vp = this.v*this.p
this.children = []
}
addChild(child){
this.children.push(child)
}
}
写的时候发现把 res[i+1][j]=r 这句赋值放在if末尾在最后一个测试用例会出错。
然后在里面设置了个判断,想输出一下r的值
if(i===6&j===270){
console.log(r)
}
这样会输出另一个错误值。然而在上方添加一个赋值语句后,则输出的r值和此处只写赋值语句得到的结果一样。
失败案例输入如下
4500 12
100 3 0
400 5 0
300 5 0
1400 2 0
500 2 0
800 2 4
1400 5 4
300 5 0
1400 3 8
500 2 0
1800 4 0
440 5 10
正确结果为16700,赋值语句放于if当中会输出16500
明明没有再次对变量r进行操作,但是却输出了不同的值,希望有大佬可以解答下