华为OD机考(HJ16 购物单)

2024-06-23 11:36
文章标签 华为 机考 od 购物单 hj16

本文主要是介绍华为OD机考(HJ16 购物单),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

应广大同学要求,开始以OD机考题作为练习题,看看算法和数据结构掌握情况。有需要练习的可以关注下。此题难度略大,需要对背包问题较为熟悉,同时题干信息量较大,都为解题造成了一定难度。

在开始此题前请提前查看Java数据结构与算法(0/1背包问题)-CSDN博客,否则理解有些困难。

描述

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

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

如果要买归类为附件的物品,必须先买该附件所属的主件,且每件物品只能购买一次。

每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。

王强查到了每件物品的价格(都是 10 元的整数倍),而他只有 N 元的预算。除此之外,他给每件物品规定了一个重要度,用整数 1 5 表示。他希望在花费不超过 N 元的前提下,使自己的满意度达到最大。

满意度是指所购买的每件物品的价格与重要度的乘积的总和,假设设第𝑖i件物品的价格为𝑣[𝑖]v[i],重要度为𝑤[𝑖]w[i],共选中了𝑘k件物品,编号依次为𝑗1,𝑗2,...,𝑗𝑘j1​,j2​,...,jk​,则满意度为:𝑣[𝑗1]∗𝑤[𝑗1]+𝑣[𝑗2]∗𝑤[𝑗2]+…+𝑣[𝑗𝑘]∗𝑤[𝑗𝑘]v[j1​]∗w[j1​]+v[j2​]∗w[j2​]+…+v[jk​]∗w[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 是所属主件的编号)

输出描述:

 输出一个正整数,为张强可以获得的最大的满意度。

输入:

1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0

输出:

2200

实现原理

本题是0/1背包问题的升级版,0/1背包问题只考虑是否买当前物品。本题则需要考虑多种情况。

不买主件、买主件、买主件和附件一、买主件和附件二、买主件和附件一附件二等5种情况。

前置的构建二维数组比较关键。题干中的每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件是关键信息。

实现代码

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int res = 0;String str = scanner.nextLine();String[] numStr = str.split(" ");int N = Integer.valueOf(numStr[0]);int m = Integer.valueOf(numStr[1]);int[][] v = new int[m + 1][3];int[][] w = new int[m + 1][3];for (int i = 1; i <= m; i++) {int v_t, p_t, q_t;String[] tempStr = scanner.nextLine().split(" ");v_t = Integer.valueOf(tempStr[0]);p_t = Integer.valueOf(tempStr[1]);q_t = Integer.valueOf(tempStr[2]);if (q_t == 0) {//主件v[i][0] = v_t;w[i][0] = p_t * v_t;} else if (v[q_t][1] == 0) {//附件一v[q_t][1] = v_t;w[q_t][1] = p_t * v_t;} else {//附件二v[q_t][2] = v_t;w[q_t][2] = p_t * v_t;}}int[][] dp = new int[m + 1][N + 1];for (int i = 1; i < m + 1; i++) {// 遍历物品for (int j = 1; j < N + 1; j++) { // 遍历背包if (v[i][0] > j) {dp[i][j] = dp[i - 1][j];  // 都不买} else {if (v[i][0] <= j) { // 只买主件dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - v[i][0]] + w[i][0]);}if (v[i][0] + v[i][1] <= j) { // 买主件+附件1dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - v[i][0] - v[i][1]] + w[i][0] + w[i][1]);}if (v[i][0] + v[i][2] <= j) { // 买主件+附件2dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - v[i][0] - v[i][2]] + w[i][0] + w[i][2]);}if (v[i][0] + v[i][1] + v[i][2] <= j) { // 买主件+附件1+附件2dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - v[i][0] - v[i][1] - v[i][2]] + w[i][0] + w[i][1] + w[i][2]);}}}}System.out.println(dp[m][N]);}
}

QA1:

这篇关于华为OD机考(HJ16 购物单)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087048

相关文章

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

华为OD机试真题-学生方阵-2024年OD统一考试(E卷)

题目描述 学校组织活动,将学生排成一个矩形方阵。 请在矩形方阵中找到最大的位置相连的男生数量。这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的。 注:学生个数不会超过10000 输入描述 输入的第一行为矩阵的行数和列数, 接下来的 n行为矩阵元素,元素间用""分隔。 输出描述 输出一个整数,表示矩阵中最长的位

华为 HCIP-Datacom H12-821 题库 (13)

有需要题库的可以看主页置顶 1.可以携带外部路由的 tag 标签信息的是以下哪一类 LSA? A、4 类 LSA B、5 类 LSA  C、3 类 LSA  D、2 类 LSA 答案:B 解析: 暂无解析 2..两台路由器直连,并设定网络类型为 p2p 建立OSPF 邻居。那么两台路由器传输 OSPF 报文的目的 IP 地址是以下哪一项? A、使用组播地址 224.0.0.6 B

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构,客户端可以订阅任意数量的主题,并可以发布消息到这些主题。服务器(通常称为MQTT Broker)则负责接受来自客户端的连接请求,并转发消

华为23年笔试题

消息传输 题目描述 在给定的 m x n (1 <= m, n <= 1000) 网格地图 grid 中,分布着一些信号塔,用于区域间通信。 每个单元格可以有以下三种状态:  值 0 代表空地,无法传递信号;  值 1 代表信号塔 A,在收到消息后,信号塔 A 可以在 1ms 后将信号发送给上下左右四个方向的信号塔; 值 2 代表信号塔 B,在收到消息后,信号塔 B 可以在 2ms

实现的动态规划问题华为笔试题C++实现

秋招刷力扣题,我觉得我对动态规划不是熟练,在此处做总结 动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。我觉得最大的问题就是对问题的分解,分解后的问题与分解前的问题具有相同的决策机制,将决策机制进行抽象,最终可以得到对应的解; 动态规划中开始介绍的爬楼梯等问题,答

828华为云征文|基于华为云Flexus云服务器X实例部搭建Halo博客平台

华为云征文|基于华为云Flexus云服务器X实例部搭建Halo博客平台 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Halo介绍2.1 Halo 简介2.2 Halo 特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、购买华为云Flexus云服务器X实例4.

三方登录 - 华为登录

1.1. 开发准备 当应用需要使用以下开放能力的一种或多种时,为正常调试运行应用,需要预先添加公钥指纹 Account Kit(华为帐号服务)Call Kit(通话服务)Game Service Kit(游戏服务)Health Service Kit(运动健康服务)IAP Kit(应用内支付服务)Live View Kit(实况窗服务,当需要使用Push Kit时必须执行此步骤)Map Kit

828华为云征文|基于Flexus云服务器X实例的应用场景-拥有一款自己的ssl监控工具

先看这里 写在前面效果图华为云Flexus云服务器X实例介绍特点可选配置购买 连接服务器Uptime-kuma简介开源信息部署准备工作:docker部署命令访问uptime-kuma 基本配置总结 写在前面 作为一个个人开发者,相信你手里肯定也有不少自己的服务,有的服务呢也是https的。 以前ssl各厂都是可以免费申请一年的,我们更换的频率还好,比较小;但是最近,各厂都