回溯法解决装箱问题

回溯法的一个应用:最优装载问题 上一篇我们介绍了回溯法。了解了回溯法的空间状态是树形结构。本篇介绍一个回溯法的一个应用:最优装载问题。 最优装载问题 我们在贪心法中介绍过最优装载问题,本篇是说它的加强版本。由于是加强版本,自然问题也变了,比原先的最优装载问题复杂了一些。原先问题是1艘轮船。而加强版的是2艘轮船 什么是加强版的最优装载问题 有n个集装箱,需要装上两艘载重为c1和c2的轮船。wi为第i个集装箱的重量,且w1+w2+…... 阅读详情

题目描述

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

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

输入格式

1个整数,表示箱子容量

1个整数,表示有n个物品

接下来n行,分别表示这n个物品的各自体积

输出格式

1个整数,表示箱子剩余空间。

输入输出样例

输入

24
6
8
3
12
7
9
7

输出

0

说明/提示

NOIp2001普及组 第4题

思路

本题可以采用动态规划进行求解,也可以采用回溯法,分支限界法求解。
这里我才用回溯法进行求解,问题也就是一个子集树,在所有的物品中选择最优的集合使得箱子剩余容量最小。从根节点开始回溯,构建一棵子集树,时间复杂度为O(n2)

代码

#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
int w[31];//定义物品重量数组,不超过30个
int bestw;//当前最优值
int cw;//当前箱子放的物品的总重量
void getbestw(int i,int c,int n)
{
    if(i>n){//递归回溯的出口
        if(bestw<cw)
            bestw=cw;//更新最优值
        return;
    }
    for(int k=0;k<=1;k++){//子集问题,要么放,要么不放
        if(cw+k*w[i]<=c){//约束函数,如果满足条件,可以遍历子树
            cw=cw+k*w[i];
            getbestw(i+1,c,n);
            cw=cw-k*w[i];
        }
    }
    return;
}
int main()
{
    int c;
    int n;
    cin>>c>>n;
    for(int i=1;i<=n;i++)
        cin>>w[i];
    getbestw(1,c,n);
    if(c-bestw<=0)//如果当前最优值大于等于箱子容纳量c
        cout<<0;//输出0
    else//输出箱子最小剩余重量
        cout<<c-bestw;
    return 0;
}

AC

在这里插入图片描述

算法设计与分析期末考试 on PTA 4-1 算法的复杂性有时间复杂性和空间复杂性之分。 4-2 若存在两个正的常数c和n0,对于任意n≥n0,都有T(n)≤c×f(n),则称T(n)= Ω (f(n))。 4-3 用贪心算法求解的问题一般具有两个重要性质是: 贪心原则和最优子结构性质。 4-4 分支限界法采用 深度 优先的方式搜索解空间,回溯法采用 广度 优先的方式搜索解空间。 4-5 通常, 贪心算法、分支限界、回溯的求解策略是自顶向下求解, 动态规划是自底向上的递推求解。 4-6 回溯法搜索解空间树时,常用的两种剪枝函数为 约束函数和限界 阅读详情

相关推荐

回溯法解决01背包问题:子集树深度优先搜索

回溯法,亦称试除法,是一种通过试错来搜索所有解的算法,直到找到所需的解为止。它采用了一种“深度优先”的搜索策略,用递归的方式来遍历所有可能的候选解,从而找到满足特定条件的解。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会丢弃该解,即回溯然后在剩余的解空间中继续搜索。组合优化问题涉及的是从有限个元素中寻找最优解的问题。这类问题的一个显著特点是在解空间中进行穷举搜索,而回溯法是解决此类问题的一个非常有效的工具。组合优化问题包括但不限于旅行商问题(TSP)、装箱问题、图着色问题等。

weixin_26850469的博客 745

最少货物装箱问题

最少数量货物装箱问题 牛客网:货物装箱问题 题目描述 有重量分别为3,5,7公斤的三种货物,和一个载重量为X公斤的箱子(不考虑体积等其它因素,只计算重量) 需要向箱子内装满 n 公斤的货物,要求使用的货物个数尽可能少(三种货物数量无限) 示例1 输入 4 输出 -1 说明:无法装满 示例2 输入 8 输出 2 说明:使用1个5公斤...

weixin_42564710的博客 1494

Pytorch(一) Pytorch 的安装

安装步骤 1.检查是否有合适的GPU, 若有安装Cuda与CuDNN 2.下载pytorch安装文件,进行pytorch的安装 检查电脑是否有合适的GPU 在桌面上右击如果能找到NVIDA控制面板,则说明该电脑有GPU。控制面板如下,并通过查看系统信息获取支持的Cuda版本 点击 帮助->点击 系统信息 弹出下面的对话框,在驱动程序版本那一栏就能看到该计算机使用的驱动版本。 ...

开开心心 25万+

《面试准备》c/c++最少装箱问题(动态规划)

问题描述: 出口质量不等的钻石n颗,至少需要多少个箱子? 输入: 一个整数m:箱子最大承载重量; 一个整数n:钻石的个数; 第i颗钻石的质量大小a[i]; 输出: 最少需要多少箱子 举例: 输入: 10 5 4 5 7 3 6 输出: 3 c++代码实现(动态规划求解): #include &lt;iostream&gt; #include &lt;algorit...

hunzhangzui9837的博客 2676

SNAP实战:哨兵1 SLC数据预处理全流程详解(附避坑指南)

本文详细解析了使用SNAP软件处理哨兵1号SLC数据的完整预处理流程。从轨道精校正、辐射定标到多视与斑点滤波,再到地理编码,文章提供了清晰的操作步骤与核心逻辑,并重点分享了实践中的常见“坑”与解决方案,旨在帮助用户高效、准确地完成SAR数据预处理。

7up55的博客 1027

【SOC 芯片设计 DFT 学习专栏 -- DFT DRC规则检查】

在现代半导体设计中,DFT(Design for Test)技术的重要性不言而喻。它确保了芯片在制造完成后能够进行高效和可靠的测试。DFT设计规则检查(DRC)作为DFT流程中的一个关键环节,通过一系列自动化工具检测设计中的潜在问题,从而保证设计的可测试性和整体质量。在本文中,我们将详细探讨DFT DRC的概念、重要性、检查流程以及具体的规则和应用。Tessent是业界领先的DFT解决方案之一,其DRC工具通过一系列自动化检查,确保设计符合DFT要求。

CodingCos的博客 4167

P1049 装箱问题——算法笔记

题目链接:https://www.luogu.org/problemnew/show/P1049 题目描述: 有一个箱子容量为V(正整数,0 ≤ V ≤ 20000),同时有n个物品(0 < n ≤ 30,每个物品有一个体积(正整数)。 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。 输入格式: 1个整数,表示箱子容量 1个整数,表示有n个物品 接下来n行,分别表示这n个...

学而不思则忘 1383

Sprd Android 13 备忘 OTA升级app没更新到目标版本,恢复出厂才生效修改这个值

【代码】Sprd Android 13 备忘 OTA升级app没更新到目标版本,恢复出厂才生效修改这个值。

m0_60898338的博客 679

贪心算法--装箱问题

按照物品体积降序排列之后,每拿出一个物品,从第一个箱子开始遍历,寻找能装下的那个箱子,装箱;将这n个物品装入若干个体积为V的箱子(约定每个物品的体积Vi都不超过V)。类型:剩余体积(remainder)、指向物品结点的头指针(hg)、指向下一个箱子的指针域(next)—>结构体变量BOX。类型:物品编号(gnum)、指向下一个物品的指针域(link)—>结构体变量GNODE。2)每次都保证将未放入箱子中体积最大的物品优先放入已打开的箱子中。若要查找每个箱子装的物品编号,遍历其hg域指向的物品链即可。

xxpr_ybgg的博客 929

SAP 成本分摊逻辑与案例(含具体数据)

摘要: SAP成本分摊通过**分配(Allocation)与分摊(Assessment)**两种方式,将间接成本中心费用按预设规则(如人数、工时、比例等)结转至直接成本对象。分配保留原始成本要素(如电费、工资),适用于需明细追踪的场景;分摊则打包为次级成本要素(如管理费用),简化核算。实操案例涵盖行政费用分配(按人数)、水电车间分摊(按工时)、机修作业分摊(作业成本法)及内部订单结算,系统通过KSV1/KSU1配置循环规则,KSV5/KSU5执行结转。关键点在于选择匹配业务的分摊基础,合理配置次级成本要素,

金牌架构师 550

第186篇 前馈控制——提升跟踪精度的补充手段

文章摘要: 本文介绍了前馈控制的原理及其在工程中的应用。与反馈控制不同,前馈控制通过提前预测目标值或扰动信息来生成控制量,避免误差出现后再纠正的延迟问题,适用于机器人、机械臂等高速运动场景。前馈控制通常与PID反馈配合使用,前者提供粗调,后者进行微调。文章详细讲解了前馈增益的调节方法(模型法、实验法、自适应法)及两种前馈类型(指令前馈和扰动前馈),并提供了代码示例和面试实战建议,强调前馈与反馈的协同设计是提升控制精度的关键。最后预告了下一篇将讨论串级PID控制架构。

郑伟强dev的专栏 398

装箱问题

装箱问题 有一个箱子容量为v(正整数,0≤v≤20000),同时有n个物品(0 要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。 输入: 箱子的容量v   物品数n   接下来n行,分别表示这n个物品的体积 输出:   箱子剩余空间 输入输出样例 输入:24   6   8     3 12 7 9 7 输出:  0   题解` 1. 使

先疯盗骨 1362

改进后的yolov8导出进行部署到rk3588上时,导出为onnx格式报错aten::fft_fft2算子不支持导出...如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 1797

回溯法

c语言经典算法五、回溯法 回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。在回溯法中,放弃当前候选解,寻找下一个候选解的

liujiwei2007的专栏 3590

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

背包问题

装箱问题有一个箱子容量为v(正整数,0≤v≤20000),同时有n个物品(0≤30),每个物品有一个体积(正整数)。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。输入:箱子的容量v  物品数n  接下来n行,分别表示这n个物品的体积输出:  箱子剩余空间输入输出样例输入:24   6   8    312797

jorty的专栏 835

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

最优装载问题

给定一艘容量为C的船,给定一批货物,货物i的重量是wi,要求在船不超重的前提下,将尽可能多的货物装上船。 //回溯法 #include int n,c; //货物的个数 和 船的容积 int cw; //已装总重量 int bestw; //最优解 int *w; void backtrack(int i) { if (i==n+1) { if

u010733810的专栏 691

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

中级软考笔记-基础知识-6-算法设计与分析

中级软件设计师笔记第6章

qq_44277244的博客 209

poj 1011 sticks...

以前做过,不过是是看着别人代码做的。今天手痒重新做一遍,两处剪枝还是没想到。还有,我真是快爱死了深搜+回溯。 #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int MAXN = 64; int N; int...

weixin_30278311的博客 81

回溯法-求解装载问题(类似0-1背包)

/************************************************************* 在 n个集装箱要装上重为 W的船,集装箱i的重量 wi。 将尽可能重的集装箱装上船,当重量相同时,取集装箱个数尽量少。 要求:1、采用回溯法, 2、采用剪枝条件(左孩子:只装载满足重量的集装箱,右孩子:至少要选3个集装箱) ***********

蛋糕店的夏天 1372

算法详解——回溯法

回溯法是一种解决的方法,特别适用于解决组合问题、搜索优化问题等。它通过逐步构建候选解决方案并且在这个解决方案不再可能满足约束或条件时进行剪枝和回溯。

python_plus的博客 4755

贪心和回溯解决装箱问题的利弊

贪心和回溯解决装箱问题的利弊 1.贪心算法 #include<stdio.h> #include<stdlib.h> void Swap(int *x,int *y){ // 交换 int t; t=*x; *x=*y; *y=t; } void sort (int w[],int t[], int n) { // 排序,由小到大 for(int m=0;m<n; m++){ // 为每个物品编序号 t[m]=m; }

Kari Town的博客 452

[NOIP2001]装箱问题(牛客)

【代码】[NOIP2001]装箱问题(牛客)

m0_75039094的博客 388

java计算箱子剩余体积,最少数量货物装箱问题

回溯法,因为树的规模会很庞大,所以要在dfs中加入提前退出条件,当找到组合方法后,后面的所有枝全部剪掉。每一次dfs的优先关系为先7后5后3,这样第一个找到的组合方法使用的箱子数目最少。因为在找到第一个组合之前,回溯的关系保持,在找到第一个组合之后,也不再需要回溯了。#include#includeusing namespace std;void dfs(vector& temp,int ...

weixin_30942339的博客 703

贪心算法实战:从装箱问题看最优解策略 | OpenJudge NOI 4.6 19

本文以OpenJudge NOI 4.6中的经典装箱问题为例,深入剖析贪心算法的核心思想与应用。通过将三维问题降维至二维平面填充,详细阐述了“先大后小”的贪心策略及其正确性证明,并提供了两种清晰的代码实现方案。文章旨在帮助信息学奥赛选手和算法爱好者掌握贪心算法的实战技巧与严谨的证明思维。

weixin_29234239的博客 266
上一篇: 0-1背包回溯法求解
下一篇: 最大团问题回溯法求解
practical_sharp
博客等级 码龄8年 499粉丝 148原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值