背包问题->采药问题->装箱问题

建模实战|第三期:解决背包问题与装箱问题-python调用Ortools求解器 背包问题(Knapsack problem):容器数量是固定的,每个容器有自己的最大容量,而需要分配的物件有各自的价值,我们的目标是让装入容器的物体的总价值最大,并不要求所有物体都装入。装箱问题( Bin-packing problem):容器数量不固定,每个容器容量是相同的,有自己的最大容量,我们的目标是用最少的容器来存放所有的物件。装箱问题也可以分为多种情况,如完全装箱问题、不完全装箱问题、一维装箱问题和二维装箱问题等。 阅读详情

一、背包问题

有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

二、采药问题:

有总时间为T,有m株药,每株药有其价值和采集时间,要求在总时间内所采药的总价值最大。

三:装箱问题:

有一个箱子容量为V(正整数0≤V≤20000),同时有n个物品(0<n≤30,每个物品有一个体积(正整数)。

要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

解题思路:

三道题都可以用搜索和动规做,但搜索容易超时,最好还是用动规。

背包问题和采药问题其实一样的,就是字换了。

背包详解见下:

01背包问题 图解+详细解析 (转载)_可控的事情要谨慎,不可控的事情要乐观。-优快云博客_背包问题原文链接:https://blog.youkuaiyun.com/qq_38410730/article/details/81667885(原文写的非常棒,算法核心思想都是一样的,用什么语言实现就不重要了)一、题目描述有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,cap...https://blog.youkuaiyun.com/qq_37767455/article/details/99086678?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164275174316780274156702%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164275174316780274156702&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-99086678.pc_search_result_cache&utm_term=%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98&spm=1018.2226.3001.4187

背包问题懂了之后就会做采药了,然后这次主要讲装箱问题。

装箱问题很显然这个数据用搜索完全没问题,而且一开始想到的也是搜索。

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int V, n, ans[35], minv = 100000;

void dps(int x)
{
	if (x == n || V < ans[x]) minv = minv > V ? V : minv;
	else
		for (int i = x; i < n; ++i) {
			if (V >= ans[i]) {
				V -= ans[i];
				dps(i + 1);
				V += ans[i];
			}
		}
}

int main()
{
	cin >> V >> n;
	int i;
	for (i = 0; i < n; ++i) cin >> ans[i];
	sort(ans, ans + n);
	if (ans[0] > V) {
		cout << V;
		return 0;
	}
	dps(0);
	cout << minv;
	return 0;
}

那么这道题就只能用搜索吗?

其实也可以用背包问题的解法,我们看背包问题和采药问题与他的共性:

三者都是在一堆数据里面要找出最优组合。

它与背包问题和采药问题的区别在于:

背包问题和采药问题都有两个属性,背包是体积和价值,采药是时间和价值,可是装箱问题只有体积。这也是有些朋友做装箱问题不会用动规来解题的原因。

那么如何用动规解决装箱问题?

其实我们不妨将装箱问题也赋有两个属性,其一就是他本有的体积,其二是赋给它一个价值的属性,价值的大小就等于他的体积大小,这样我们就很自然的理解了他的动规解法。

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int V, n, arr[35], ans[20005];

int main()
{
	cin >> V >> n;
	int i, o;
	for (i = 1; i <= n; ++i) cin >> arr[i];
	for (i = 1; i <= n; ++i) {
		for (o = V; o >= arr[i]; --o) {
			ans[o] = max(ans[o - arr[i]] + arr[i], ans[o]);
		}
	}
	cout << V-ans[V];
	return 0;
}

末了,解释一下,无论是背包问题还是装箱、采药,他们对应的ans[i]的值(也就是体积为i时所拥有的价值)我们必须认为他是最优的,这样才非常容易想明白。 

装箱(背包)问题(Packing Problem) 装箱问题也叫背包问题,简单来说,就是把小货物往大箱子里装,要如何才能装得多。个人常见的经历就是“装冰箱”,很有趣的现象就是常常感觉冰箱再也装不下了,但是经过一翻折腾之后又神奇的装下了。 从企业运作角度来看就是尽量让每个容器(仓库、车辆、集装箱、船等)装的尽量多,可以节约企业的费用。通常,装载率85%左右,使用装箱优化方法后,可以达到90~95%左右。海尔做过一个海运装箱的项目,节约了大量 阅读详情

相关推荐

手把手教你解决Cherry-MCP-Blender自动建模中的32000和32001错误

本文针对Cherry-MCP-Blender自动建模集成中常见的-32000和-32001连接错误,提供了一套完整的解决方案。文章深入剖析了错误根源,并手把手指导用户完成uv与bun等关键依赖的安装配置、Blender MCP服务的部署,以及高级排查与稳定性优化,帮助用户彻底解决连接问题,构建稳定的AI驱动3D建模自动化工作流。

river的博客 361

JAVA动态规划(五)--01背包问题及装箱问题

问题:01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。在给定容量为C的条件下,求如何选取物体使带来的价值最大化。分析:记发f(m, n)表示给定第一件至第m件物品时,给定容量为n 时的最大价值。 则:状态转移方程: f(i,j)=max{f(i-1,j-wi)+vi, f(i-1,j)}java代码如下:package

gaven的博客 8711

动态规划入门练习【01背包问题】——洛谷

P1048 [NOIP2005 普及组] 采药 思路 01背包问题【思路可以看哔哩哔哩视频哈】 附上视频链接吧 动态规划DP0-1背包_哔哩哔哩_bilibili 【这个是我觉得最清楚最基础的视频】 洛谷试练场 普及组 动态规划的背包问题_哔哩哔哩_bilibili【题目来源哦】 代码实现【菜鸟本鸟自己写的】 #include<bits/stdc++.h> using namespace std...

m0_62331212的博客 1947

装箱问题(背包问题)

装箱问题(背包问题)

weixin_69884785的博客 709

反激变压器设计学习笔记

反激变压器匝比感量设计

m0_55419117的博客 5262

保姆级教程:在阿里云ECS上用Docker一键部署EMQX MQTT服务器(Ubuntu 20.04)

本文提供在阿里云ECS上使用Docker一键部署EMQX MQTT服务器的详细教程,涵盖从实例创建、Docker环境配置到EMQX部署与优化的全流程。适合物联网开发者快速搭建高效、安全的MQTT消息服务器,适用于智能家居、工业物联网等场景。

weixin_28739079的博客 308

动态规划DP 背包问题 01背包(模型讲解+应用:采药+装箱问题+数字组合)

接下来的 M行每行包括两个在 1到 100之间(包括 1和 100)的整数,分别表示采摘某株草药的时间和这株草药的价值。输入文件的第一行有两个整数 T和 M,用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。输出文件包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。如果你是一个聪明的孩子,你应该可以让采到的草药的。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。

fcc13461862452的博客 1223

WPF实战:HelixToolkit 3D图形开发入门指南

本文详细介绍了如何使用HelixToolkit在WPF中进行3D图形开发,从环境搭建到创建第一个3D程序(如彩色立方体),再到进阶技巧和常见问题排查。通过实战案例和性能优化建议,帮助开发者快速掌握3D场景构建和模型导入技术,提升开发效率。

weixin_29197051的博客 758

01背包:采药+装箱问题

01背包例题

wang_yi_ran的博客 222

【深度学习】脸部修复,CodeFormer,论文,实战

Blind face restoration是一个高度 ill-posed 的问题,通常需要辅助引导来 1) 改善从降级输入到期望输出的映射,或者 2) 补充在输入中丢失的高质量细节。在本文中,我们展示了在一个小的代理空间中学到的离散码本先验可以通过将盲目的面部恢复建模为 a code prediction task来大大减少恢复映射的不确定性和模糊性,同时为生成高质量面部提供丰富的视觉元素。

q742971636的博客 2994

032、准谐振反激变换器(QR-Flyback)原理

文章摘要: 本文以65W PD快充炸管案例切入,解析准谐振反激变换器(QR-Flyback)原理。通过主动利用漏感与MOS结电容的谐振,在Vds波谷开通实现近似ZVS,显著降低开关损耗与电压应力。对比传统反激,QR模式轻载效率提升8%,Vds尖峰减少23%。关键设计要点包括:变压器漏感需<3%、谷底检测电路需抗干扰、启动阶段需防过冲。推荐NCP1340等专用控制芯片,并强调VCC电容优选低ESR陶瓷材质。QR适用于30W-150W场景,其核心优势在于轻载效率优化,但需平衡漏感控制与可靠性。作者结合实测数据与

Jack010169的博客 114

背包问题之01背包 FJUT装箱问题&&FJUT采药

本帖有引用“背包9讲”内容,特此感谢! 题目描述:有N件物品和一个容量为V的背包。放入第i件物品消耗的费用是Ci,得到的价值是Wi。求解将哪些物品装进背包可以使价值总和最大。 基本思路:这是最基本的背包问题,特点是:每种物品仅有一件,可以选择放或者不放。 用F[I,V]表示前i件物品恰放入一个容量为V的背包可以获得的最大价值。则其状态转移方程便是:F[I,V]=MAX{F[ I-1,V ],F[ ...

别把暗恋当饭吃 302

【Python机器学习】主成分分析(PCA):高维数据的“瘦身术“

主成分分析(PCA)的历史可以追溯到1901年,当时Karl Pearson首次提出了这个概念。在计算机还不存在的年代,PCA是一个纯粹的数学构想,用来简化多变量数据的分析。几十年后,当计算机出现时,PCA成为了数据分析中最早实现的算法之一。从那时起,超过一个世纪的发展中,PCA一直保持着其核心的理论框架和实用价值,这本身就是对这个方法深刻科学性的证明。在现代深度学习时代,许多人可能会认为PCA已经过时了。但事实恰好相反。

nmdbbzcl的博客 981

2021-01-10背包问题

1.问题A:装箱问题 题面: 题解: 1.逆向处理,是该题的正向处理,即dp数组初始化为背包大小,每放入一个减去相应的容量,对于第i个物体,选择放:dp[i][j-a[i]]-a[i]或者不放dp[i-1][j],dp[i][j]为前i个物体恰好装进容量为j的背包时的v-这部分容量的最小容量。(每一个直接用v减去当前最大的容量) 2.正向处理,即常规的dp[i][j]表示前i个物体恰好装进容量为j的背包所能获得的最大价值,最后再用V减去最终最大。 化为一维数组,逆向枚举j #include<stdi

weixin_46064382的博客 198

主流反爬虫、反作弊防护与风控对抗手段

主流反爬虫、反作弊风控防护中的核心设计点与对抗策略

吴秋霖的博客 2555

deepstream车道线检测自定义插件化,其中要注意pipeline的配置,如果插件位置配置不对,会报input format should be RGBA when using blur-obje

以上代码中,我们先从对象池中获取一个 DsUserMeta 对象,然后使用 get_lane_line_from_frame 函数获取车道线检测结果,并使用 add_lane_line_meta 函数将其添加到 DsUserMeta 对象中。注意,上述代码中的 get_lane_line_from_frame 函数和 add_lane_line_meta 函数需要你自己实现,用于从视频帧中提取车道线检测结果,并将其添加到 DsUserMeta 中。

pvmsmfchcs的博客 690

背包问题

1.采药 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。” 如...

小飞猪的博客 479

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【C】背包问题

//01背包 #include&lt;stdio.h&gt; #include&lt;iostream&gt; #include&lt;algorithm&gt; using namespace std; const int maxn=100;//物品最大件数 const int maxv=1000;//容量最大值 int w[maxn],c[maxn],dp[maxv]; int main(){...

Li_Jiaqian的博客 854

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

P1049 装箱问题

关键是要能看出来是个背包问题。

jiang_wan_的博客 409

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

洛谷普及训练:动态规划(2)01背包系列问题——P1048 采药,P1049 装箱问题

P1048 采药 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大...

qq_35299223的博客 315

背包问题总结

title: 背包问题最终总结 tags: 算法 c++ 背包问题最终总结 categories: 算法 top: true 0-1背包 1.采药问题 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一...

qq_38440882的博客 3330

采药

P1-048装箱问题 采药 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的...

weixin_44836745的博客 613

codeup 11.7 背包问题

问题 A: 装箱问题 时间限制:1 Sec内存限制:128 MB 提交:350解决:128 [提交][状态][讨论版][命题人:外部导入] 题目描述 【问题描述】 有一个箱子的容量为V(V为正整数,且满足0≤V≤20000),同时有n件物品(0的体积值为正整数。 要求从n件物品中,选取若干装入箱内,使箱子的剩余空间最小。 输入:1行整数,第1个数表示箱子的容量,第2个数...

树叶子的博客 383

(笔记未完成)【动态规划】背包问题:0-1背包问题

难度:普及- 动态规划的经典题型 学习区分贪心算法和动态规划的条件 0-1背包问题

gzkeylucky的博客 279

【DP复习】背包 ovo

水题10s切得pj-的那种QAQ P1048 采药 (01) 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int sz = 1010; 5 int dp[sz], val[sz], tim[sz]; 6 int t, m; 7 int ma...

weixin_34407348的博客 92
上一篇: P1042 [NOIP2003 普及组] 乒乓球
下一篇: P1060 [NOIP2006 普及组] 开心的金明
Merran_
博客等级 码龄5年 10粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Merran_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值