关于做牛客华为机试算法题遇到的疑惑

描述

王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:

主件附件
电脑打印机,扫描仪
书柜图书
书桌台灯,文具
工作椅

输入描述:

输入的第 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进行操作,但是却输出了不同的值,希望有大佬可以解答下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值