从9.10拼多多笔试第四题产生的01背包感悟
文章目录
- 题面
- 基本的01背包问题
- 本题变式
本文参考:
9.10拼多多笔试ak_牛客网 (nowcoder.com)
拼多多 秋招 2023.09.10 编程题目与题解 (xiaohongshu.com)
题面
拼多多9.10笔试的最后一题,是一道比较好的01背包变式问题,可以学习其解法加深对01背包问题的理解。
这是拼多多2023-9-10秋招笔试的第四题,数据量不大,甚至可以通过dfs暴力穷举写出来,每个部件只有修和换两种选择,总共就是2^N(N<=40)的复杂度,理论上来说这个复杂度是很危险的,但有题友也做出来了。当时自己也是有畏难心理,甚至没有去尝试写dfs,导致这题0分,下次多少得先尝试一下。
可是dfs终究是没那么优雅,这题其实可以巧妙地转换为背包问题。初次尝试时也确实往背包问题考虑了,但是想想一个维度为修车部件N,一个维度为修车时间M,并且题目要求无论是修还是换,这些部件全部都得处理好,也就是物品要被“全部选取”,一般的背包问题好像没法往“全部选择”这上面靠,基本思想都是在有限的容量下达成价值的最大,而选出来物品是“部分选择”出来的。
基本的01背包问题
一个基本的01背包问题如下:
在背包容量为4的情况下,选择价值最大的物品组合。
从打印的答案中也可以看出,最后只选择了15,20这两件物品。
/*** 每件物品只能取一次* @Author jiangxuzhao* @Description* @Date 2023/9/10*/
public class bag01 {public static void main(String[] args) {// 物品价值和成本int[] values = {15, 20, 30};int[] costs = {1, 3, 4};// 背包最多装4int maxBag = 4;// 物品数量int len = costs.length;// dp[i][j]表示从下标为[0,i]物品中选择,放进容量为j的背包中能产生的最大价值// 整体空间根据物品-背包容量排开int[][] dp = new int[len][maxBag+1];// 初始化,这里maxBag+1留下maxBag=0的空间,方便偷懒递归后续背包容量,dp[0][]偷懒指定第一个物品// 倒序初始化保证每个物品只会被选取一次for (int j = maxBag; j>=0; j--){if (j >= costs[0]) {dp[0][j] = dp[0][j-costs[0]] + values[0];}}// 递推公式,本次物品选或者不选for (int i = 1; i < len; i++){// 倒序遍历背包容量保证每个物品只会被选取一次for (int j = maxBag; j>=0; j--){// 不选本次物品idp[i][j] = dp[i-1][j];// 选择本次物品iif (j >= costs[i]) {dp[i][j] = Math.max(dp[i][j], dp[i-1][j-costs[i]]+values[i]);}}}// 结果打印for (int i = 0; i < len; i++){for (int j = 0; j<=maxBag; j++){System.out.print(dp[i][j]+" ");}System.out.println();}}
}
本题变式
提示:这题确实也可以用01背包来做,但是需要经过一层转换。
这里需要求的是在M时间内修好自行车,再去看要的最少金钱,那么首先要检查不计成本,最少时间的情况下是否可以修好自行车,也就是将所有“换部件”的时间累加,判断是否大于M,如果不超过M,则还有降低成本的空间。
假设上面所有“换部件”的累加时间为leastTime,那么M-leastTime就是我们还能够去多花费的缓冲时间,考虑部件i,如果换成“修部件”,在原先的基础上,时间成本增加Ai - Ci,可以减少Di - Bi的成本。这其实就可以转换成01背包问题了,首先在“全部换”的基础上,起码能保证物品能够被“全部选择处理”,然后n个部件中,如果选择“修”,能够多花的总时间容量为M-t,第i个物品修理多花费的时间是Ai-Ci,能减少Di - Bi的成本,求一个“选择处理的修组合”来最大减少成本,保证花钱最少。
最终编码如下:
import java.util.Scanner;/*** 输入样例* 1 10* 10 2 3 5* 输出样例* 2* 输入样例* 1 10* 12 2 3 5* 输出样例* 5* 输入样例* 1 10* 10 2 3 5* 输出样例* 2* @Author jiangxuzhao* @Description* @Date 2023/9/12*/
public class Pdd_9_10_D {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int M = sc.nextInt();// 全部换的时间long leastTime = 0L;// 全部换的成本long maxCost = 0L;// 类比01背包,对于物品i,values[i]为可以减少的成本,costs[i]为多花费的时间int[] values = new int[N];int[] costs = new int[N];for(int i = 0; i < N; i++) {// 修时间int Ai = sc.nextInt();// 修成本int Bi = sc.nextInt();// 换时间int Ci = sc.nextInt();// 换成本int Di = sc.nextInt();leastTime += Ci;maxCost += Di;values[i] = Di - Bi;costs[i] = Ai - Ci;}if (leastTime > M){System.out.println(-1);return;}// 最大背包容量 = 多花费的缓冲时间int maxBag = (int)(M - leastTime);// 最大背包价值 = 选择处理的修组合最大减少成本long bagRes = 0L;long[][] dp = new long[N][maxBag+1];// 倒序初始化for(int j = maxBag; j >= 0; j--){if(j >= costs[0]) dp[0][j] = dp[0][j-costs[0]] + values[0];}for (int i = 1; i<N; i++){for (int j = maxBag; j>=0; j--){// 不选当前物品dp[i][j] = dp[i-1][j];// 选当前物品dp[i][j] = Math.max(dp[i][j], dp[i-1][j-costs[i]]+values[i]);}}bagRes = dp[N-1][maxBag];// 最少花费的金钱long res = maxCost - bagRes;System.out.println(res);}
}
相关文章:
从9.10拼多多笔试第四题产生的01背包感悟
文章目录 题面基本的01背包问题本题变式 本文参考: 9.10拼多多笔试ak_牛客网 (nowcoder.com) 拼多多 秋招 2023.09.10 编程题目与题解 (xiaohongshu.com) 题面 拼多多9.10笔试的最后一题,是一道比较好的01背包变式问题,可以学习其解法加深对…...
搭建自己的OCR服务,第一步:选择合适的开源OCR项目
一、OCR是什么? 光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。 亦即将图像中的文字进行识别,并以文本的形式返回。 二、OCR的基本流程 1…...
【C++】VScode配置C/C++语言环境(简洁易懂版)
目录 一、下载VScode(装好直接跳第五步)二、安装VScode三、VScode设置语言为中文四、VScode切换主题(个人爱好)五、下载C语言编译器(MinGW-W64 GCC)六、配置编译器环境变量七、配置VScode八、使用单独窗口…...
【hive】—原有分区表新增加列(alter table xxx add columns (xxx string) cascade;)
项目场景: 需求:需要在之前上线的分区报表中新增加一列。 实现方案: 1、创建分区测试表并插入测试数据 drop table test_1; create table test_1 (id string, score int, name string ) partitioned by (class string) row format delimit…...
verilog学习笔记7——PMOS和NMOS、TTL电路和CMOS电路
文章目录 前言一、PMOS和NMOS1、NMOS2、PMOS3、增强型和耗尽型4、两者面积大小 二、CMOS门电路1、非门2、与非门3、或非门4、线与逻辑5、CMOS传输门6、三态门 三、TTL电路四、TTL电路 VS CMOS电路五、数字电平六、使用CMOS电路实现逻辑函数1、上拉网络 PUN2、下拉网络 PDN3、实…...
Java知识点二
Java知识点二 1、Comparable内部比较器,Comparator外部比较器2、源码结构的区别:1)Comparable接口:2)Comparator接口: 2、Java反射 1、Comparable内部比较器,Comparator外部比较器 我们一般把Comparable叫…...
基于单片机压力传感器MPX4115检测-报警系统-proteus仿真-源程序
一、系统方案 本设计采用52单片机作为主控器,液晶1602显示,MPX4115检测压力,按键设置报警,LED报警。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 /***************************************…...
Pytorch02 神经网路搭建步骤
文章目录 import numpy as np import torch from PIL.Image import Image from torch.autograd import Variable# 获取数据 def get_data():train_Xnp.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,7.042,10.791,5.313,7.997,5.654,9.27,3.1])train_Ynp.asarr…...
【源码】JavaWeb+Mysql招聘管理系统 课设
简介 用idea和eclipse都可以,数据库是mysql,这是一个Java和mysql做的web系统,用于期末课设作业 cout<<"如果需要的小伙伴可以http://www.codeying.top";可定做课设 线上招聘平台整合了各种就业指导资源,通过了…...
Java中级编程大师班<第一篇:初识数据结构与算法-数组(2)>
数组(Array) 数组是计算机编程中最基本的数据结构之一。它是一个有序的元素集合,每个元素都可以通过索引进行访问。本文将详细介绍数组的特性、用法和注意事项。 数组的基本特性 数组具有以下基本特性: 有序性: 数…...
杰哥教你面试之一百问系列:java集合
文章目录 1. 什么是Java集合?请简要介绍一下集合框架。2. Java集合框架主要分为哪几种类型?3. 什么是迭代器(Iterator)?它的作用是什么?4. ArrayList和LinkedList有什么区别?它们何时适用&#…...
【数据结构】树和二叉树概念
1.树概念及结构 树概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点,…...
C盘清理教程
C盘清理教程 首先使用space Sniffer 扫一下c盘,然后看一下到底是哪个文件这么大 第二步,创建软链接。 首先将我们需要移动的文件的当前路径拷贝下来:C:\Users\Tom\Desktop\test-link\abc\ghi.txt 然后假设剪切到D盘下:D:\ghi.…...
【实战-05】 flinksql look up join
摘要 look up join 能做什么? 不饶关子直接说答案, look up join 就是 广播。 重要是事情说三遍,广播。flinksql中的look up join 就类似于flinks flink Datastream api中的广播的概念,但是又不完全相同,对于初次访问…...
C++数据结构--红黑树
目录 一、红黑树的概念二、红黑树的性质三、红黑树的节点的定义四、红黑树结构五、红黑树的插入操作参考代码 五、代码汇总 一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过…...
Linux perf使用思考
目录 一、参考资料(建议阅读)二、值得思考的几个问题1、perf使用不同的性能事件进行统计有什么区别呢?2、那使用不同的性能事件统计出来的数据?排序是如何决定的,其中的百分比数值在不同的性能事件进行统计时各自的意义…...
自定义路由断言工厂
我们来设定一个场景: 假设我们的应用仅仅让age在(min,max)之间的人来访问。 第1步:在配置文件中,添加一个Age的断言配置 spring: application:name: api-gateway cloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: trueroute…...
Nacos安装及在项目中的使用
目录 概要一、安装 Nacos1、下载 Nacos2、解压3、启动 Nacos 服务器4、自定义Nacos启动脚本5、访问Nacos Web控制台 二、Nacos----服务注册与发现1、添加 Nacos 依赖2、配置 Nacos 服务器地址3、使用 Nacos 注册服务4、启动服务 三、Nacos----配置管理1、创建配置数据2、从 Nac…...
overleaf中latex语法总结
α和bata $\alpha$ $\beta$上标和下标同时使用 $A_{IJ}^{IJ}$\\ %上标^下标_多个使用{}行内公式 \noindent $abc$\\ %行内公式\documentclass{article} \usepackage[utf8]{inputenc} \usepackage[namelimits]{amsmath} %数学公式 \usepackage{amssymb} %数学公式…...
Grafana配置邮件告警
1、创建一个监控图 2、grafana邮件配置 vim /etc/grafana/grafana.ini [smtp] enabled true host smtp.163.com:465 user qinziteng05163.com password xxxxx # 授权码 from_address qinziteng05163.com from_name Grafanasystemctl restart grafana-serv…...
setup中的nextTick函数
await nextTick() 是 Vue 3 的一个异步函数,用于等待 DOM 更新完成后执行回调函数, 它在 setup 函数中非常有用,可以确保在对 DOM 进行操作之前,先等待 Vue 完成相关的 DOM 更新。 下面是一个示例,演示了 await nextT…...
Matlab信号处理3:fft(快速傅里叶变换)标准使用方式
Fs 1000; % 采样频率 T 1/Fs; % 采样周期:0.001s L 1500; % 信号长度 t (0:L-1)*T; % 时间向量. 时间向量从0开始递增,0s~1.499sS 0.7*sin(2*pi*50*t) sin(2*pi*120*t); % 模拟原信号 X S 2*randn(size(t)); …...
Python|合并两个字典的几种方法
在Python中,有多种方法可以通过使用各种函数和构造函数来合并字典。在本文中,我们将讨论一些合并字典的方法。 1. 使用方法update() 通过使用Python中的update()方法,可以将一个列表合并到另一个列表中。但是在这种情况下,第二个…...
ElementUI浅尝辄止24:Message 消息提示
常用于主动操作后的反馈提示。与 Notification 的区别是后者更多用于系统级通知的被动提醒。 1.如何使用? Message 在配置上与 Notification 非常类似,所以部分 options 在此不做详尽解释,可以结合 Notification 的文档理解它们。Element 注…...
让照片动起来的软件,轻松制作照片动效
随着社交媒体的日益普及,我们对于照片的要求也越来越高。普通的照片已经不能满足我们的需求,我们希望照片更加生动有趣。照片动效便应运而生,它可以让照片动起来,吸引更多的注意力,让照片更加生动有趣。 照片动效制作起…...
【图解RabbitMQ-7】图解RabbitMQ五种队列模型(简单模型、工作模型、发布订阅模型、路由模型、主题模型)及代码实现
🧑💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...
Linux命令200例:write用于向特定用户或特定终端发送信息
🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师࿰…...
javaee spring整合mybatis spring帮我们创建dao层
项目结构 pom依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...
修改Tomcat的默认端口号
1、找到Tomcat的安装路径。 2、打开conf文件夹。 3、用记事本打开server.xml文件 4、找到 <Connector port"8080" protocol"HTTP/1.1",其中的8080就是tomcat的默认端口,将其修改为你需要的端口即可。...
Open3D Ransac拟合空间直线(python详细过程版)
RANSAC拟合直线 一、算法原理1、算法简介2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法简介 见:Open3D——RANSAC 三维点云空间直线拟合 2、参考文献...
洛阳专业网站设计开发制作建站公司/推广普通话手抄报简单漂亮
题图:https://unsplash.com/nielsenramon在OO(面向对象)编程中,类中的方法有多种形式:实例方法、静态方法、类方法、甚至还可以有抽象方法,本文来说说实例方法在Python中是如何工作的,后面再来谈其他方法。先来定义一个…...
哪个网站做黑色星期五订酒店活动/域名解析网站
作者:LanceToBigDatahttps://www.cnblogs.com/zhangyinhua/p/11558510.html一、Lambda简述1.1、Lambda概述Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有…...
网站怎么做自己站长/线上营销渠道主要有哪些
关注云报洞察深一度“浪潮存储,要争取早日成为中国存储市场第一!”浪潮信息总裁彭震在近日举行的IDTC2021浪潮存储数据科技峰会上的一席话,立刻引起了线上线下参会者的热烈反响。浪潮信息总裁 彭震是不是感觉,类似的话曾经在什么场…...
惠州网站制作网站/上海十大营销策划公司
试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试…...
能用织梦做动态网站么/软文推广公司
关于刷抖音、打游戏为什么上瘾有个著名的嗑瓜子理论:就是如果你在嗑瓜子的时候,随随便便几个小时就没了,但如果换成学习,时间就是过得很慢。因为一粒瓜子,从你磕到吃只需要几秒钟,吃就是你得到的反馈。你觉…...
做淘宝需要知道什么网站/福州网站排名推广
创建父工程 idea创建父工程 idea创建一个工程。父工程管理公共资源 添加子模块 选择添加到父工程里面spring_cloud_parent 相应的子模块添加到父工程的pom.xml文件里 转载于:https://www.cnblogs.com/mentalidade/p/10326343.html...