【华为机试刷题笔记】HJ16-购物单

2023-11-04

图片来源网络,详细信息不详,仅供欣赏呦
王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:

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

如果要买归类为附件的物品,必须先买该附件所属的主件,且每件物品只能购买一次。
每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。
王强查到了每件物品的价格(都是 10 元的整数倍),而他只有 N 元的预算。除此之外,他给每件物品规定了一个重要度,用整数 1 ~ 5 表示。他希望在花费不超过 N 元的前提下,使自己的满意度达到最大。
满意度是指所购买的每件物品的价格与重要度的乘积的总和,假设设第 i i i件物品的价格为 v [ i ] v[i] v[i],重要度为 ω ( i ) \omega(i) ω(i),共选中了 k k k件物品,编号依次为 j 1 , j 2 , . . . , j k j_1,j_2,...,j_k j1,j2,...,jk,则满意度为: v [ j 1 ] ∗ ω [ j 1 ] + v [ j 2 ] ∗ ω [ j 2 ] + . . . + v [ j k ] ∗ ω [ j k ] v[j_1]*\omega[j_1]+v[j_2]*\omega[j_2]+...+v[j_k]*\omega[j_k] v[j1]ω[j1]+v[j2]ω[j2]+...+v[jk]ω[jk]。(其中 * 为乘号)
请你帮助王强计算可获得的最大的满意度。

输入描述:
输入的第 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行可知总钱数N50以及希望购买的物品个数m为5;
	第2和第3行的q为5,说明它们都是编号为5的物品的附件;
	第4~6行的q都为0,说明它们都是主件,它们的编号依次为3~5;
	所以物品的价格与重要度乘积的总和的最大值为10*1+20*3+20*3=130

题解

下面展示本人题解思路代码。

/* 
fill()方法用一个固定值填充一个数组中从起始索引到终止索引内的全部元素,不包括终止索引。
map() 方法定义在JavaScript的Array中,它返回一个新的数组,数组中的元素为原始数组调用函数处理后的值。
 */
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 line = await readline()
  //注意将接收到的数据处理为Number类型
  let [N, m] = line.split(' ').map(Number)
  //N<32000,定义总钱数所对应满意度的数组并初始化为0
  let dp = new Array(32000).fill(0)
  //主件(m<60)
  let zj = new Array(61)
  //定义二维数组并初始化
  for (let i = 1; i < m + 1; i++) {
    //每个可购买物品对应6个参数:主件价格、主件满意度、附件1价格、附件1满意度、附件2价格、附件2满意度
    zj[i] = new Array(6)
    for (let j = 0; j < 6; j++) {
      zj[i][j] = 0
    }
  }
  //接收输入(表2)
  for (let i = 1; i < m + 1; i++) {
    let line = await readline()
    //注意将接收到的数据处理为Number类型
    let [p, v, q] = line.split(' ').map(Number)
    //判断是否为主件
    if (q == 0) {
      zj[i][0] = p
      zj[i][1] = p * v
    } else {
      //附件1
      if (zj[q][2] == 0) {
        //第q件主件的附件1价格
        zj[q][2] = p
        //第q件主件的附件1满意度
        zj[q][3] = p * v
      } else {
        //附件2
        //第q件主件的附件2价格
        zj[q][4] = p
        //第q件主件的附件2满意度
        zj[q][5] = p * v
      }
    }
  }
  //动态规划(表3)
  for (let i = 1; i < m + 1; i++) {
    for (let j = N; j > 0; j -= 10) {
      //只买主件
      //判断主件价格是否大于0
      if (zj[i][0] > 0) {
        //判断j是否大于主件价格
        if (j >= zj[i][0]) {
          dp[j] = Math.max(
            dp[j],
            //第i件主件满意度+所拥有钱减去买第i件主件的价格后剩余钱的满意度
            zj[i][1] + dp[j - zj[i][0]]
          )
        }
        //主件+附件1
        if (zj[i][2] > 0 && j >= zj[i][0] + zj[i][2]) {
          dp[j] = Math.max(
            dp[j],
            zj[i][1] + zj[i][3] + dp[j - zj[i][0] - zj[i][2]]
          )
        }
        //主件+附件2
        if (zj[i][4] > 0 && j >= zj[i][0] + zj[i][4]) {
          dp[j] = Math.max(
            dp[j],
            zj[i][1] + zj[i][5] + dp[j - zj[i][0] - zj[i][4]]
          )
        }
        //主件+附件1+附件2
        if (zj[i][4] > 0 && j >= zj[i][0] + zj[i][2] + zj[i][4]) {
          dp[j] = Math.max(
            dp[j],
            zj[i][1] + zj[i][3] + zj[i][5] + dp[j - zj[i][0] - zj[i][2] - zj[i][4]]
          )
        }
      }
    }
  }
  //打印当接收钱数为N时的满意度
  console.log(dp[N])
})()

下图为以示例2来分析问题的部分解题思路,代码中的表格2、表格3请参考下图内容。
原创
文章系原创,在阅读过程中如若有误,劳请指正;如若有妙解、疑惑也欢迎大家和我交流,感谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【华为机试刷题笔记】HJ16-购物单 的相关文章

  • 设置 JavaScript 对象的 length 属性

    假设我有一个 JavaScript 对象 function a var A this length function return A length this add function x A push x this remove func
  • Angular JS - 如何验证数字输入中的位数

    我们想要做的是 有一个仅接受 0 24 的输入 对于时间输入应用程序 这些是用户应该能够输入到输入中的值 0 1 2 3 4 5 6 7 8 9 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
  • javascript 中的类型安全或如何避免很难检测到类型相关的错误

    我来自 Java 世界 即类型安全的世界 现在正在做一些需要使用 JavaScript 进行客户端执行的事情 由于 JS 的非典型化 我有时会遇到很难检测到错误的情况 我想知道是否有任何方法可以提前阻止它 例如 设置诸如 使用典型化 之类的
  • 使用 vue.js 显示 json 结果

    您好 我尝试使用 vue js 显示 json 文件结果 目标是结果将显示在值上 这是我的代码 data return fetchData function var self this self http get api casetotal
  • 使用 JS 和 HTML 将当前 URL 插入链接

    所以 我已经阅读了类似的内容 但我仍然找不到更适合我正在做的事情的答案 我正在尝试使用 JS 获取当前页面 URL 并将其附加到社交媒体共享链接 如下所示 a href target blank 使用 Javascript 我成功地将当前
  • 带有 socket.io 的 Node.js 服务器可同时处理 50000 个客户端

    我们正在开发一个 Javascript 控件 它应该不断连接 到服务器以接收动画更新 我们计划将这些东西托管在亚马逊云上 场景是这样的 服务器连接到 activemq 队列等待更新 对于每个更新 它都会将其广播到所有连接的客户端 是否可以使
  • JavaScript 函数参数和范围

    我用下面列出的代码做了一些测试 function foo x alert y var y I am defined outside foo definition foo 上面的代码给了我一个警告 我是在 foo 定义之外定义的 然后另一个测
  • Internet Explorer 的数组indexOf 实现

    有很多关于如何将 indexOf 实现放入数组原型中以便它可以在 Internet Explorer 下工作的解决方案 但是我偶然发现了一个问题 到目前为止我所看到的任何地方似乎都没有解决这个问题 使用非常一致的MDC 的实施 https
  • 如何从回调函数中获取值

    我对 javascript 比较陌生 并且面临一些困难 我有两个 java 脚本文件 如下所示 我无法获取变量的值条目标题在 getRss 函数内并将其存储在变量内Rss1 标题 and Rss2 标题 创建一个全局变量并将其分配给条目标题
  • 为什么这些 Javascript for 循环在 Firefox 上比 Chrome / Safari 上慢得多?

    我在搞基准网站jfprefs http jsperf com 并创建了我自己的基准http jsperf com prefix or postfix increment 9 http jsperf com prefix or postfix
  • navigator.platform 在 ARM Mac 上的价值是什么?

    苹果有released https www apple com apple events november 2020 几款基于采用 ARM 架构的 M1 芯片的新计算机 与之前基于 x86 架构的计算机相比 的价值是多少navigator
  • 如何防止缓慢脚本警告并强制浏览器继续运行脚本直到完成?

    更新 2013 年 7 月 5 日 自从我最初问这个问题以来 我学到了很多东西 在下面的一条评论中 有人建议我重新处理该任务 并找到一种方法来解决它 而不会有阻塞 UI 的风险 我说不可能 函数必须按原样运行 我实际上不记得我试图用这个函数
  • 不明白为什么 Chrome/Safari 无法在此处获取 ScrollHeight

    我只是问了一个问题 为什么某些 js 代码不能 100 在 Chrome 和 Safari 中工作 但经过更多故障排除后 我想我发现这是我应该发布的问题 我有一个页面 其中有一个表单 该表单的目标是同一页面上的 iframe iframe
  • JavaScript 中的自定义“确认”对话框?

    我一直在开发一个使用自定义 模式对话框 的 ASP net 项目 我在这里使用吓人引号 因为我知道 模式对话框 只是我的 html 文档中的一个 div 它被设置为出现在文档其余部分的 顶部 而不是真正意义上的模式对话框 在网站的许多部分
  • 如何使用 jQuery AJAX 和 JSON 通过 Bootbox 确认表单提交

    我正在使用一个网络应用程序工作Spring MVC 我试图在提交表单之前显示一个确认对话框Bootbox 但我收到 500 内部服务器错误 这是我的表格
  • 如何检查 URL 末尾是否有特定字符串

    我需要根据 URL 末尾的内容让覆盖层向下滑动 如果 URL 末尾有 faq 覆盖层下降 如何在 jQuery JavaScript 中做到这一点 如果您的网址看起来像这样http yourdomain com faq 你可以这样做 var
  • 动态多个延迟 jQuery Ajax 调用

    使用 jQuery 的延迟模式http api jquery com jQuery when http api jquery com jQuery when 我正在尝试进行多个 jsonp ajax 调用并等待结果 然后再进行下一步 我可以
  • JavaScript 不是 DOM 的一部分吗?

    为什么即使从 DOM 中删除用于创建脚本的代码 脚本仍然可以运行 我遇到了一种情况 我想阻止损坏的脚本运行 查看我的帖子 https stackoverflow com questions 2685581 is there a way to
  • 1° 夏令时 Java 和 JS 表现出不同的行为

    假设巴西利亚 GMT 0300 夏令时于 21 10 2012 00 00 00 此时时钟应提前一小时 Java new Date 2012 1900 9 21 0 0 0 Sun Oct 21 01 00 00 BRST 2012 Chr
  • 获取不正确的日期,将时间戳转换为新日期

    我正在尝试将时间戳转换为日期 但得到的日期不正确 我正在开发一个使用 Angular 和 Typescript 的项目 我有这样的时间戳 1451642400 2016年1月1日 和1454320800 2016年2月1日 如果我编码 da

随机推荐

  • 三维坐标系怎么画?

    在中学时代主要接触的是二维平面坐标需系 但是在学习空间几何图形时 会需要用到三维坐标系 这就需要我们也要掌握其绘制方法 在黑板上画三维坐标系有点困难 所以要借助专业的绘图工具来完成 下面就一起来学习具体绘制技巧 几何画板作为专业的几何绘图软
  • 智能手机普及游戏 国内外巨头上演GPU芯片争霸

    转自 http tech sina com cn t 2014 02 12 16139155996 shtml 新浪科技讯 2月12日下午消息 随着近日国家解除游戏机禁令以及游戏向手机终端转移 国内外移动通信芯片厂商高通 75 62 0 9
  • umi-request设置请求头_scrapy_splash 设置随机请求头

    本文为 霾大 scrapy splash 爬取 js 加载网页初体验 zhuanlan zhihu com 的补充 在上面的文章中我们仅仅是初步完成了 scrapy splash 的简单使用 接下来我们将介绍如何是使得 splash 在 r
  • 时间序列模型(二):AR模型

    全文共8000余字 预计阅读时间约18 30分钟 满满干货 建议收藏 介绍 在时间序列分析中 我们经常遇到一种强大而灵活的模型 即ARIMA模型 这个模型已经在各种领域 如经济学 气候学 股票市场分析等 发挥了巨大的作用 尽管ARIMA模型
  • 掌握react,这一篇就够了

    react众所周知的前端3大主流框架之一 由于出色的性能 完善的周边设施风头一时无两 本文就带大家一起掌握react jsx语法 前端MVVM主流框架都有一套自己的模板处理方法 react则使用它独特的jsx语法 在组件中插入html类似的
  • vue 的指令

    目录 一 vue 的指令 1 v text 2 v html 3 v show 4 v if v esle if v else 1 v if 2 v if 与 v show 5 v for 1 v for 渲染一个数组 2 v for 渲染
  • node-sass安装后,启动本地环境爆出,Error: Node Sass does not yet support your current environment: Windows 64-bit

    最近有个很老的项目各种依赖库都很老 在本地环境中出现 Error Node Sass does not yet support your current environment Windows 64 bit with Unsupported
  • springboot运行出现 错误: 找不到或无法加载主类 com.xxxx.xxxx.Application

    项目打成jar包放在服务器上之后就未在使用 今天打开一运行居然报错 错误 找不到或无法加载主类 com fdway omui OmUiApplication 解决办法 1 项目 右键 Debug As 或 Run As Maven inst
  • 一些有趣的 js 功能函数

    一些有趣的 js 功能函数 数组 生成数组 打乱数组 数组简单数据去重 数组唯一值数据去重 多数组取交集 查找最大值索引 查找最小值索引 找到最接近的数值 压缩多个数组 拉链函数 矩阵交换行和列 数字转换 进制转换 正则 手机号格式化 去除
  • Docx:docx.opc.exceptions.PackageNotFoundError: Package not found at

    Docx docx opc exceptions PackageNotFoundError Package not found at https blog csdn net python reported article details 1
  • java finalize方法总结、GC执行finalize的过程

    注 本文的目的并不是鼓励使用finalize方法 而是大致理清其作用 问题以及GC执行finalize的过程 1 finalize的作用 finalize 是Object的protected方法 子类可以覆盖该方法以实现资源清理工作 GC在
  • 记一次计算机网络工程实验(1) 利用VLAN划分不同网段

    一学期没上过计算机网络工程的课 今天是第一次去做实验 把经验记在这里 免得过几天又忘了 安装Cisco Packet Tracer 首先需要下载和安装这次实验的工具 Cisco Packet Tracer 这是一个模拟路由器 交换机和各种终
  • Tomcat遇到闪退和Using CATALINA_OPTS:问题如何解决

    Tomcat遇到闪退和Using CATALINA OPTS 问题如何解决 最快的方法直接重新下载tomcat 链接 https pan baidu com s 1h12kdt5ZESJDdxY4AkcVjQ pwd oqsz 提取码 oq
  • 关于日期的正则表达式

    QTP是quicktest Professional的简称 是一种自动测试工具 QTP自带教程中有关于日期的正则表达式的例子 即对时间 月 日 年采用正则表达式方法进行检查 但经常是测试失败 例子中提供的表达式为 0 1 0 9 0 3 0
  • Vue3-ElemenPlu,全栈开发后台系统-JWT方案讲解第三章-Koa架构设计接口方面实现mongdb安装配置工具函数的封装前台首页实现

    第三章 Koa架构设计 usr bin env node Module dependencies var app require app var debug require debug
  • elasticsearch script实战

    写在前面 大家在开发elasticsearch的时候都会遇到很多去怪的需求 如果我们已知的RestAPI无法帮助我们完成搜索 是就需要我们自己动手写脚本来辅助搜索 完成需求 浅谈elasticsearch script脚本使用机制 通过阅读
  • angular:angular重用策略与ionic重用策略浅谈

    angular默认重用策略 同一个路由地址互相跳转会复用 否则会重新创建component 无任何重用 ionic默认重用策略 同一个路由地址会复用 在离开当前路由时会缓存路由地址对应的组件 当再次遇到相同路由地址时会恢复 但是复用后 如果
  • Vue移动框鼠标拖拽自定义指令

    在Vue中通过自定义指令 实现指定的模块带有鼠标拖拽移动效果 移动框自定指令 Vue directive drag bind el gt let initX null let initY null el style cursor move
  • 3-3 OneHot编码

    3 3 OneHot编码 请参考 数据准备和特征工程 中的相关章节 调试如下代码 基础知识 import pandas as pd g pd DataFrame gender man woman woman man woman g gend
  • 【华为机试刷题笔记】HJ16-购物单

    王强决定把年终奖用于购物 他把想买的物品分为两类 主件与附件 附件是从属于某个主件的 下表就是一些主件与附件的例子 主件 附件 电脑 打印机 扫描仪 书柜 图书 书桌 台灯 文具 工作椅 无 如果要买归类为附件的物品 必须先买该附件所属的主