【华为机试】HJ16 购物单详解+完整源代码示例

news2024/9/21 20:49:44

从毕业到入职,忙于各种事情,所以博客一直也没有空更新。从入职到现在差不多整三个月了,刚刚在比亚迪这边转正。目前干的工作涉及到开发的工作不是很多,但是又怕之前的技能荒废了。所以最近有个想法,再把C++算法和数据结构的东西捡起来,练一练。

现在再做这些,反而少了一些功利心,可以单纯地去学一下算法和数据结构的东西。

先定个小目标:把华为机试这100多道算法题先干掉!然后记录一下其中中等难度及以上难度题目的解析。一方面激励自己,一方面也给自己的学习过程留个记录,后面再回顾的时候,也更方便些。

题目

图片1
图片2
图片3

题目解析

首先这个题目比较长,比较复杂,所以理解起来也稍微有点费劲,需要仔细去读,不然很容易在理解上产生错误和偏差。

关键点

  1. 王强要购买的物品分为两类,有主件和附件两种,附件不再有自己的附件。
  2. 每个主件可以有0个,1个或者2个附件,即最多一个主件可以有两个附件。
  3. 每个物品有一个重要度,用1~5表示。
  4. 单个物品的满意度 = 价格 * 重要度

最后题目要求要使王强得到最大的满意度,并且输出是多少。

从题目来看,该题目是0-1背包问题的一个扩展。

有关0-1背包问题的动态规划,下面这篇博客写得非常详细,我这里不再赘述。
【动态规划】01背包问题(通俗易懂,超基础讲解)

这里简单说一下0-1背包里面要解决的问题以及其中定义的一些变量,方便下面来进行比较。

图片4

如上图所示

  • 这里背包的容量就相当于王强所拥有的总钱数N。
  • 物体的体积或者说重量w相当于该题目中物品的价格。
  • 而价值v相当于该题目中的满意度。

另外该问题与0-1背包问题的一个区别就是:

  • 0-1背包问题对于物品要考虑的就是两种情况:
    • 不选
  • 该题目则是有五种情况:
    • 不买
    • 只买主件
    • 买主件 + 附件1
    • 买主件 + 附件2
    • 买主件 + 附件1 + 附件2

所以,解这个题目需要先重新把这个表填了。

令v[i]表示第i个物品的价格:

  • v[i][0] 表示物品是主件
  • v[i][1] 表示物品是附件1
  • v[i][2] 表示物品是附件2

令w[i]表示第i个物品的满意度:

  • w[i][0] 表示物品是主件
  • w[i][1] 表示物品是附件1
  • w[i][2] 表示物品是附件2

令dp[i][j] 表示当前钱数为j,前i个物品最佳组合对应的价值。

状态转移方程

dp[i][j] = max(

dp[i-1][j] ,(不买第i件物品)

dp[i-1][j-w[i][0]]+v[i][0] ,(买第i件物品)

dp[i-1][j - w[i][0]-w[i][1]]+v[i][0]+v[i][1] , (买第i件物品与其附件1)

dp[i-1][j - w[i][0]-w[i][1]-w[i][2]]+v[i][0]+v[i][1]+v[i][2] ,(买第i件物品与其附件2)

dp[i-1][j-w[i][0]-w[i][1]-w[i][2]-w[i][3]]+v[i][0]+v[i][1]+v[i][3]).(买第i件物品与其两件附件)

需要注意的几个点:

  • 物品编号从1开始
  • 遍历顺序为先遍历背包,再遍历物品,这是因为有主件附件等不同情况的原因。
  • 初始化的边界条件均为0,即dp[0][……]和dp[……][0]均为0

源代码

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
    int N, m;
    cin >> N >> m;
    vector<vector<int>> v(m + 1, vector<int>(3, 0));  // 存价格,相当于0-1背包中的W
    vector<vector<int>> w(m + 1, vector<int>(3, 0));  // 存价格*重要度,即满意度,相当于0-1背包中的V
    vector<vector<int>> dp(m + 1, vector<int>(N + 1, 0)); 
    N /= 10;
    for (int i = 1; i < m + 1; i++) { // 物品编号从1开始,q为0表示主件,为1表示第1件物品的附件
        int vv, p, q;
        cin >> vv >> p >> q;
        vv /= 10; // 简化计算,加快计算速度
        if (q) {  // 如果q不为0,则说明第i个物品是附件
            if (w[q][1]) { // 如果w[q][1]不为0,则说明不是第一个附件
                v[q][2] = vv; 
                w[q][2] = vv * p;
            } else { // 否则就是第一个附件
                v[q][1] = vv;
                w[q][1] = vv * p;
            }
        } else { // 否则,第i个物品是主件
            v[i][0] = vv;
            w[i][0] = vv * p;
        }
    }
    for (int j = 1; j < N + 1; j++) { // 遍历背包
        for (int i = 1; i < m + 1; i++) { // 遍历物品
            if (v[i][0] > j) {
                dp[i][j] = dp[i-1][j];  // 都不买
            } else {
                if (v[i][0] <= j) { // 只买主件
                    dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i][0]]+w[i][0]);
                }
                if (v[i][0]+v[i][1] <= j) { // 买主件+附件1
                    dp[i][j] = 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) { // 买主件+附件2
                    dp[i][j] = 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+附件2
                    dp[i][j] = 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]);
                }
            }    
        }
    }
    cout << dp[m][N] * 10 << endl;
    return 0;
}

参考文献

【华为机试】HJ16 购物单

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/733209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Zygote 启动流程

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: Android系统包含netd、servicemanager、surfaceflinger、zygote、media、installd、bootanimation 等基本服务&#xff0c;具体作用请看下图。 Android…

English Learning - L3 作业打卡 Lesson8 Day60 2023.7.5 周三

English Learning - L3 作业打卡 Lesson8 Day60 2023.7.5 周三 引言Part 1 总结&#x1f349;句1: 11 years ago, when I lost my legs, I had no idea what to expect.成分划分连读爆破语调 &#x1f349;句2: But if you ask me today, if I would ever want to change my si…

java+Mysql 图书管理系统(idea)

目录 前言 部分界面截图 登录界面 注册界面 图书管理界面 关于我们界面 部分代码 登录界面 数据库工具类 前言 jdk 版本&#xff1a;openjdk version "11.0.12" MySql版本&#xff1a;5.7.40 加&#xff08;vx&#xff1a;lixuanzi0521&#xff09;帮调试 …

递推--Fibonacci数列 II

描述 众所周知&#xff0c;Fibonacci数列是一个著名数列。它的定义是&#xff1a; 本题要求采用第二种方法&#xff1a;递推。 输入描述 每行一个整数 i &#xff0c;表示 Fibonacci 数列的第i项。 i ≤ 100000 对比前一题&#xff0c;本题的数据规模是 十万 &#xff01; …

css基础知识十九:让Chrome支持小于12px 的文字方式有哪些?区别?

一、背景 Chrome 中文版浏览器会默认设定页面的最小字号是12px&#xff0c;英文版没有限制 原由 Chrome 团队认为汉字小于12px就会增加识别难度 中文版浏览器 与网页语言无关&#xff0c;取决于用户在Chrome的设置里&#xff08;chrome://settings/languages&#xff09;把…

应用层:电子邮件

1.应用层&#xff1a;电子邮件 笔记来源&#xff1a; 湖科大教书匠&#xff1a;应用层概述 湖科大教书匠&#xff1a;电子邮件 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 电子邮件系统采用客户/服务器方式&#xff08;C/S&#xff09; 电子邮件…

计算机视觉 3D点云极简概述

一、概述 点云是表示 3D 坐标系中的数字 3D 物理对象或空间的点数据库。它由数百万或者更多个单独的测量点组成,具有 x、y 和 z 坐标。3D点云是物体的高精度数字记录。点云用于生成用于 3D 建模的 3D 网格和其他模型。包括医学成像、3D 打印、制造、建筑、3D 游戏和虚拟现实 (…

NSS [NISACTF 2022]babyupload

NSS [NISACTF 2022]babyupload 源码给了提示&#xff0c;/source路径 访问后得到一个文件&#xff0c;是源码 from flask import Flask, request, redirect, g, send_from_directory import sqlite3 import os import uuidapp Flask(__name__)SCHEMA """CRE…

基于matlab使用PointNet深度学习进行点云分类(附源码)

一、前言 此示例演示如何训练 PointNet 网络以进行点云分类。 点云数据由各种传感器获取&#xff0c;例如激光雷达、雷达和深度摄像头。这些传感器捕获场景中物体的3D位置信息&#xff0c;这对于自动驾驶和增强现实中的许多应用非常有用。例如&#xff0c;区分车辆和行人对于…

【优选算法题练习】day1

文章目录 一、283. 移动零1.题目简介2.解题思路3.代码4.运行结果 二、1089. 复写零1.题目简介2.解题思路3.代码4.运行结果 三、202. 快乐数1.题目简介2.解题思路3.代码4.运行结果 总结 双指针&#xff1a; 一、283. 移动零 1.题目简介 283. 移动零 给定一个数组 nums&#x…

vscode: Unable to determine workspace folder

故障现象&#xff1a; 用vscode的bashdb调试bash 脚本时&#xff0c;出现如下打印&#xff1a; 故障原因&#xff1a; setttings.json中&#xff0c;“cwd”定义目录错误&#xff0c;或者缺少“cwd”定义&#xff1b; 解决办法&#xff1a; 打开settings.json文件&#xff…

SpringBoot+Vue 的在线考试系统

&#x1f495;&#x1f495;作者&#xff1a;程序员徐师兄 个人简介&#xff1a;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&…

Python环境搭建秘籍:开发者的黄金组合!

1、vscode下载并安装。 Visual Studio Code - Code Editing. Redefined 2、安装插件。 在vscode中按ctrlshiftx快捷键打开extension的界面。 输入python关键字&#xff0c;注意选择Micorosoft的。 3、创建python代码。 C:\pythoncode\weather.py import wx import request…

tidb之旅——dm工具篇

作者&#xff1a; 有猫万事足 原文来源&#xff1a; https://tidb.net/blog/666ab16d 前言 稳定了tidb的集群&#xff0c;确定了写入热点问题的处理方式&#xff0c;搞好了监控&#xff0c;就要准备接入生产服的写入流量进入tidb集群了。这就轮到了dm工具的出场。这个过程十…

视频行为识别(一)——综述

Deep Neural Networks in Video Human Action Recognition: A Review 本次分享的文章是2023年收录在计算机视觉领域的顶刊“CVPR”&#xff08;级别&#xff1a;视觉类TOP&#xff09;期刊上。该期刊详细信息可关注公众号 AI八倍镜 点击菜单项查询。 论文地址&#xff1a;http…

减法优化器SABO算法优化VMD参数,最小包络熵、样本熵、信息熵、排列熵(适应度函数可自行选择,一键修改)包含MATLAB源代码...

今天给大家带来一期由2023年智能优化算法减法优化器SABO优化VMD的两个参数。关于减法优化器SABO的原理及MATLAB代码的详细介绍大家可以看这篇文章。2023年优化算法之减法平均优化器&#xff0c;matlab代码直接复制&#xff0c;并与灰狼&#xff0c;粒子群算法比较 同样以西储大…

IL、BC、IRL、GAIL、RL差点给我搞懵逼了,整理一下

(308条消息) 模仿学习&#xff1a;逆向强化学习(Inverse Reinforcement Learning&#xff0c; IRL)_UQI-LIUWJ的博客-CSDN博客 //这个把IRL讲的比较大白话&#xff0c;相对好解释 &#xff0c;讲的确实好 强化学习逆强化学习简单总结_哔哩哔哩_bilibili//这个妹子也讲的很不错…

计算机体系结构基础知识介绍之指令级并行性:概念和挑战

一、相关概念 自 1985 年以来&#xff0c;所有处理器都使用流水线来重叠指令的执行并提高性能。 指令之间的这种潜在重叠称为指令级并行性&#xff08;ILP&#xff09;。 具体来说&#xff1a;流水线和指令级并行是两个相关的概念。 流水线是一种将每条指令分解为多个阶段&am…

阿里云域名注册域名持有者信息模板创建流程(图文)

阿里云域名注册域名持有者个人或企业都需要有已经通过实名认证的信息模板&#xff0c;如果没有可用的信息模板&#xff0c;需要先创建信息模版&#xff0c;等待信息模板实名通过后才可以注册域名&#xff0c;阿里云百科来详细说下阿里云注册域名创建信息模板实名全过程&#xf…

Python源文件改写

题目 Python源文件改写。编写一个程序&#xff0c;读取一个Python源程序文件source.py&#xff0c;将文件中所有除保留字外的小写字母换成大写字母。 代码 import keyword import jieba from tkinter import filedialogf_path filedialog.askopenfilename() keywords keyw…