装箱问题(背包问题)
题目描述
有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入格式
第一行,一个整数,表示箱子容量; 第二行,一个整数,表示有n个物品; 接下来n行,分别表示这n个物品的各自体积。
输出格式
一个整数,表示箱子剩余空间。
样例输入
24 6 8 3 12 7 9 7
样例输出
0
解题思路
这一题乍一看与背包问题相似,但是相较于背包问题更加简单,没有价值设定,一开始我试着用更加通俗易懂的方法写,即从大到小依次遍历,进行装箱,直到装不下为止
我用了两个for循环以求left(剩余空间大小),即
//第一个for循环遍历到 装入下一个箱子,空间为负为止
for(int i=0;i<n;i++)//将箱子从大到小依次装到箱中{if(arr[i]+sum<v){sum+=arr[i];}}left=v-sum;//这里空间剩余:3
for(int i=0;i<n;i++)
{if(arr[i]<=left)//以剩余空间作为判断条件 { sum+=arr[i];left=v-sum;//更新left}
}
最终代码得
#include<stdio.h>int main()
{int v, n;//v表示体积,n表示物品个数int max, temp,sum=0,left;scanf("%d", &v);scanf("%d", &n);int arr[n];for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}for (int i = 0; i < n; i++)//冒泡排序,将体积从大到小放入arr[i]中{for(int j=0;j < n-1-i;j++){if (arr[j + 1] > arr[j]){temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
/*for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
*/for(int i=0;i<n;i++)//将箱子从大到小依次装到箱中{if(arr[i]+sum<v){sum+=arr[i];}}left=v-sum;//这里空间剩余:3for(int i=0;i<n;i++){if(arr[i]<=left)//以剩余空间作为判断条件sum+=arr[i];left=v-sum;}printf("%d",left);return 0;
}
但这样写不具有通用性,还是要用到动态规划算法,代码如下
其中最重要的一段即
for(i=1;i<=n;i++)
//从1开始是因为当v=0, 箱子装不下任何东西,i=0表示第0件物品,即没有物品,所以跳过 for(j=v;j>=1;j--)
/*
把数组压缩到一维必须逆序,因为01背包问题就是由旧值推新值,从前面开始的话,旧值就会过早被新值覆盖
例如:
如果a[30]在a[20]的基础上加了w[i]=10,表示30容量这个背包它拿了w[i]=10这个东西了,但是--它没有考虑:a[20]里面是否拿过w[i]=10这个东西,所以要j--;
也就是说箱子的体积从小到大遍历,物品从大到小开始装,这样才能避免重复装入物品
*/{//j可以看作箱子当前的容量 if(w[i]<=j)//判断是否能装下物品i a[j]=MAX(a[j],a[j-w[i]]+w[i]);//原式为a[i][j]=MAX(a[i-1][j],a[i-1][j-w[i]]+w[i]) }
for(j=v;j>=1;j--)
还是不懂为什么j--
那么就多写:
for(j=v;j>=1;j--)的情况
for(j=1;j<=v;j++)的情况
可以看到从a[14]开始,旧值已经覆盖新值了
注:a[j]为没放入,a[j-w[i]]+w[i]为放入
如下图所示a[j]为V(容量),a[j-w[i]]为放入w[i]后剩余的容量,a[j-w[i]]+w[i]为放入w[i]后的容量大小,不理解的可以依据上图观察规律:
最终代码如下
#include<stdio.h>int w[40]={0};//注意初始化 ,这里表示物品的体积
int a[30011]={0};//这里表示v
int MAX(int n,int m)
{if(m<=n) return n;else return m;
}
int main()
{int n,i,j,v;scanf("%d",&v); scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&w[i]);for(i=1;i<=n;i++)//从1开始是因为当v=0, 箱子装不下任何东西,i=0表示第0件物品,即没有物品,所以跳过 for(j=v;j>=1;j--)
/*
把数组压缩到一维必须逆序,因为01背包问题就是由旧值推新值,从前面开始的话,旧值就会过早被新值覆盖
例如:
如果a[30]在a[20]的基础上加了w[i]=10,表示30容量这个背包它拿了w[i]=10这个东西了,但是--它没有考虑:a[20]里面是否拿过w[i]=10这个东西,所以要j--;
也就是说箱子的体积从小到大遍历,物品从大到小开始装,这样才能避免重复装入物品
*/{//j可以看作箱子当前的容量 if(w[i]<=j)//判断是否能装下物品i a[j]=MAX(a[j],a[j-w[i]]+w[i]);//原式为a[i][j]=MAX(a[i-1][j],a[i-1][j-w[i]]+w[i]) }// a[j]为不拿,a[j-w[i]]+w[i]为拿//a[j-w[i]]+w[i]意为放入物品i后,总占用空间=物品i所占的空间+箱子剩余的空间 j-w[i] 所能被占用的最大空间 a[j-w[i]]printf("%d",v-a[v]);//此时的a[v]表示当容量为v时,箱子已被占用空间a[v] return 0;
}
这是@佳佳佳佳佳博主的图,有助于理解
MAX(a[i-1][j],a[i-1][j-w[i]]+w[i])
这是最简单的背包问题,一定要理解,如果还有点迷糊的话,可以看看这篇文章
http://t.csdn.cn/X7GLD
或者
http://t.csdn.cn/CleVM
相关文章:

装箱问题(背包问题)
题目描述 有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。 输入格式 第一行,一个整…...
【C++】总结4-this指针
文章目录 什么是this指针this指针存在的意义this指针的特性this指针存在哪里this指针可以为空吗 什么是this指针 C编译器给每个非静态成员函数增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数…...
go压力测试
压力测试 1.1.1. Go怎么写测试用例 开发程序其中很重要的一点是测试,我们如何保证代码的质量,如何保证每个函数是可运行,运行结果是正确的,又如何保证写出来的代码性能是好的,我们知道单元测试的重点在于发现程序设计…...

【计算机网络】socket编程基础
文章目录 1. 源IP地址和目的IP地址2. 理解MAC地址和目的MAC地址3. 理解源端口号和目的端口号4. PORT与PID5. 认识TCP协议和UDP协议6. 网络字节序7. socket编程接口7.1 socket常见API7.2 sockaddr结构 1. 源IP地址和目的IP地址 因特网上的每台计算机都有一个唯一的IP地址&#…...

学C的第三十天【自定义类型:结构体、枚举、联合】
相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第二十九天【字符串函数和内存函数的介绍(二)】_高高的胖子的博客-CSDN博客 1 . 结构体 (1). 结构体的基础知识: 结构…...
Ubuntu(20.04):通过noVNC实现网页访问vnc
VNC vnc是日常工作和生产环境中常用的远程桌面控制工具。 通常需要在被访问的系统中安装vncserver。 然后在发起访问端,安装客户端软件,比如VNC Viewer。 noVNC noVNC提供了一种方案,就是通过web浏览器直接访问vnc server。 其实现的基本原理是: 1.已经安装好的vncse…...
OpenAI的Function calling 和 LangChain的Search Agent
OpenAI的Function calling openai最近发布的gpt-3.5-turbo-0613 和 gpt-4-0613版本模型增加了function calling的功能,该功能通过定义功能函数,gpt通过分析问题和函数功能描述来决定是否调用函数,并且生成函数对应的入参。函数调用的功能可以…...

【mysql数据库】MySQL7在Centos7的环境安装
说明: 安装与卸载中,用户全部切换成为root,⼀旦安装,普通用户就能使用。初期练习,mysql不进行用户管理,全部使⽤root进⾏,尽快适应mysql语句,后⾯学了用户管理,在考虑新…...

基于vue+element 分页的封装
目录标题 项目场景:认识分页1.current-page2.page-sizes3.page-size4.layout5.total6.size-change7.current-change 封装分页:创建paging:进行封装 页面中使用:引入效果 项目场景: 分页也是我们在实际应用当中非常常见…...
面试题模拟
C# 装箱和拆箱是什么? 装箱是指用堆空间来存放值类型数据 拆箱是指将存放在堆空间的值类型数据转换到栈空间 值和引用类型在变量赋值时的区别是什么? 值类型的数据赋值的时候是指向同一块内存区域,当前一个改变的时候后一个也会跟着改变。 引…...

Linux6.13 Docker LNMP项目搭建
文章目录 计算机系统5G云计算第四章 LINUX Docker LNMP项目搭建一、项目环境1.环境描述2.容器ip地址规划3.任务需求 二、部署过程1.部署构建 nginx 镜像2.部署构建 mysql 镜像3.部署构建 php 镜像4.验证测试 计算机系统 5G云计算 第四章 LINUX Docker LNMP项目搭建 一、项目…...
数据包协议栈处理
看了两个不错的帖子,记录一下。 4.2 TCP Segmentation Offload(TSO)_Remy的学习记录-CSDN博客_tcp-segmentation-offload Linux内核参数之rp_filter - 萝卜1992 - 博客园...
html刷新图片
文章目录 前言网页整体刷新改变图像的url 备注 前言 海思3516的一个开发板,不断的采集图像编码为jpeg,保存为同一个文件。打算用网页实现查看视频的效果,需要前端能够自动刷新。 目前找到了两个方法,一个是网页的不断刷新&#…...

PHP反序列化漏洞之魔术方法
一、魔术方法 PHP魔术方法(Magic Methods)是一组特殊的方法,它们在特定的情况下会被自动调用,用于实现对象的特殊行为或提供额外功能。这些方法的名称都以双下划线开头和结尾,例如: __construct()、__toString()等。 …...

2023年的深度学习入门指南(20) - LLaMA 2模型解析
2023年的深度学习入门指南(20) - LLaMA 2模型解析 上一节我们把LLaMA 2的生成过程以及封装的过程的代码简单介绍了下。还差LLaMA 2的模型部分没有介绍。这一节我们就来介绍下LLaMA 2的模型部分。 这一部分需要一些深度神经网络的基础知识,不懂的话不用着急…...
智能安全配电装置应用场景有哪些?
安科瑞 华楠 一、应用背景 电力作为一种清洁能源,给人们带来了舒适、便捷的电气化生活。与此同时,由于使用不当,维护不及时等原因引发的漏电触电和电气火灾事故,也给人们的生命和财产带来了巨大的威胁和损失。 为了防止低压配电…...

Rust vs Go:常用语法对比(四)
题图来自 Go vs. Rust performance comparison: The basics 61. Get current date 获取当前时间 package mainimport ( "fmt" "time")func main() { d : time.Now() fmt.Println("Now is", d) // The Playground has a special sandbox, so you …...
c++ 派生类 文本查询程序再探
Query_base类和Query类 //这是一个抽象基类,具体的查询类型从中派生,所有成员都是private的 class Query_base {friend class Query;protected:using line_no TextQuery::line_no;//用于level函数virtual ~Query_base() default;private://eval返回与…...

17. 电话号码的字母组合
题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" …...

Redis 基础知识和核心概念解析:理解 Redis 的键值操作和过期策略
🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~ἳ…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...