回溯法经典例题--求解装载问题--C语言

【回溯算法】装载问题 【问题描述】 给定n个集装箱要装上一艘载重量为c的轮船,其中集装箱i的重量为wi。集装箱装载问题要求确定在不超过轮船载重量的前提下,将尽可能多的集装箱装上轮船。 由于集装箱问题是从n个集装箱里选择一部分集装箱,假设解向量为X(x1, x2, …, xn),其中xi∈{0, 1}, xi =1表示集装箱i装上轮船, xi =0表示集装箱i不装上轮船。 输入 每组测试数据:第1行有2个整数c和n。C是轮船的载重量(0<c<30000),n是集装箱的个数(n≤20)。第2行有n个整数w1, w2, …, 阅读详情

问题描述:

        n个集装箱要装上一艘重量为W的轮船,重量用数组w【】表示。不考虑体积限制,先要从这些集装箱中选出重量和小于等于W并且尽可能大的若干装上船。

求解:

         货物的选择会构成一颗完全二叉树,左孩子对应选择当前物品,右孩子对应不选择。父节点的值对应当前选择下总的重量,如图。(这里只画了一部分) 

        

        但如果单纯的对二叉树进行深度递归搜索,那么时间复杂度是很大的,为2^n。

        我们可以加上一些剪枝函数,来有效的缩小时间复杂度。       

        增加变量rw,来记录剩下物品的总的重量和。

        走左孩子的前提只要加上该孩子的重量之后<=W就可继续往下走,否则直接剪枝。

        走右孩子的前提是当前已有重量tw+没选物品总重量rw-想选的物品重量>maxw,就可以继续往下走,该式子的含义是即使不选该物品,剩下的物品重量仍存在超过maxw的可能,否者直接剪枝。如图。

        可以看出带上了剪枝函数后,树的深搜会去掉很多不必要的子树,大大提高算法效率。

代码:

        i当前物品编号,n物品数量,W限制重量,rw剩余物品总重,tw当前选择总重,w【】物品的重量,temp【】记录当前选择的结果。

#include<stdio.h>
#include<iostream>
using namespace std;
#define max 10
int maxw = 0;
void dfs(int i, int n,int W, int rw, int tw, int* w, int* temp) {
	if (i == n) {
		if (tw > maxw) {
			maxw = tw;
			for (int i = 0; i < n; i++)
				cout << temp[i] << " ";
		}
	}
	else {
		if (tw + w[i] <= W) {
			temp[i] = 1;
			dfs(i + 1, n, W, rw - w[i], tw + w[i], w, temp);
		}
		if (tw + rw - w[i] > maxw) {
			temp[i] = 0;
			dfs(i + 1, n, W, rw - w[i], tw, w, temp);
		}
	}
}
int main() {
	int n = 5;
	int w[] = { 5,2,6,4,3 };
	int temp[max];
	memset(temp, 0, sizeof(temp));
	dfs(0, n, 10, 20, 0, w, temp);
	return 0;
}

装载问题的回溯法解决 C语言方法 子集树解法 一、问题描述 有一批共n个集装箱要装上2艘载重量分别为b1和b2的轮船,其中集装箱i的重量为wi,且,装载问题要求确定是否有一个合理的装载方案可将这些集装箱装上这2艘轮船且保证装的集装箱最重。如果有,找出一种装载方案。 二、大致思路 我们利用回溯法来解决,先来了解一下回溯法的算法框架: (1)问题的解空间 用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含问题的一个最优解。例如,对于... 阅读详情

相关推荐

回溯算法——装载问题C语言

回溯算法——装载问题C语言 求解思路 输入: W = <w1+w2+···+wn>为集装箱重量c1和c2为船的最大载重量 算法思想 令第一艘船的装入量为W1。 用回溯算法求使得 c1-W1 达到最小的装载方案,即尽可能的使第一艘船装的更多; 若满足 w1+w2+···+wn -W1≤c2 则有解 ,否则无解; 若有解,其解的形式表示为一维向量x[n],x[i]==1表示第i个集...

weixin_42159412的博客 5962

c 装载问题 回溯法

#include #include typedef struct {     int* w;     int c ;     int cw;     int bestcw;     int n ; }ship_info; ship_info ship; void BackTrace(int i); void BackTrace(int i) {     if(i > ship.n) return ;     if(i == ship.n){         if(ship.

xiaolei1982致力于Web开发 1271

C语言回溯法装载问题

Problem D 装载问题 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。 输入: 多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n 输出: 对于每个测例在单独的一

geshengtong的博客 6125

回溯法——(1)装载问题(C语言讲解)

​有一批共n个集装箱要装上2艘载重量分别为c1和c1的轮船,其中集装箱i重量为wi,且装载问题要求确定是否有一个合理的装载方案可将这一批集装箱装上这2艘轮船。如果有,找出一种装载方案。 ​

StarPrayers.的博客 4741

中小型微服务系统 硬件设备如何部署,QPS大概多少

作为一名合格的开发工程师,不仅仅要在前期开发阶段对业务和技术有深入了解,知道选用哪种合适的技术,业务如何拆分,还要思考后期线上环境,资源,延迟,性能等如何优化维护以及分布式系统一些线上生产的一些问题。 本篇主要针对之前了解的情况对硬件设备资源做一个简单的介绍: 首先分布式系统线上实践问题,我们应该对公司的流量,各个服务,网管,注册中心应该如何部署,部署多少台机器才合适,每台机器的配置如何,每天整体流量有多少,高峰期的请求量有多少,你的整体系统是否扛得住(注:很多公司现在直接使用K8S docker 实现

wangxuelei036的博客 1万+

贝塞尔曲线基础

贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算法开发,以稳定数值的方法求出贝兹曲线。

YiYeZhiNian的博客 2048

用c语言验证装载问题 回溯法,算法分析设计回溯法求解装载问题实验报告

《算法分析设计回溯法求解装载问题实验报告》由会员分享,可在线阅读,更多相关《算法分析设计回溯法求解装载问题实验报告(7页珍藏版)》请在人人文库网上搜索。1、回溯法求解装载问题 一、一、方法一般原理方法一般原理 回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选 解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘 若当前候选解除了还不满足问题规...

weixin_28695903的博客 1495

OpenCV 开闭运算

开运算和闭运算是将腐蚀和膨胀按照一定的次序进行处理。 但这两者并不是可逆的,即先开后闭并不能得到原来的图像。 开运算 开运算是先腐蚀后膨胀,其作用是:分离物体,消除小区域。特点:消除噪点,去除小的干扰块,而不影响原来的图像。 闭运算 闭运算与开运算相反,是先膨胀后腐蚀,作用是消除/“闭合”物体里面的孔洞,特点:可以填充闭合区域。 cv.morphologyEx(img, op, kernel) img: 要处理的图像 op: 处理方式:若进行开运算,则设为cv.MORPH_OPEN,若进行闭

꧁༺ʚvv༒catɞ༻꧂的博客 949

回溯法经典例题(二):java解装载问题

装载问题 问题描述 有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且∑wi≤C1+C2,装载问题要求确定一个合理的装载方案可将这n个集装箱装上这2艘轮船。 容易证明,如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案: (1) 首先将第一艘轮船尽可能装满; (2) 将剩余的集装箱装上第二艘轮船。 证明过程: 假设wt是已经装上第一艘轮船的集装箱重量和,由于题目要求,则需所有集装箱的重量减去wt得小于或等于第二艘轮船的最大载重量,又由于第二艘轮船的最大载重量

sc2333的博客 2836

HTTPS接口测试翻车实录:为什么浏览器能访问而curl报证书错误?

本文深入分析了HTTPS接口测试中浏览器访问正常而curl报证书错误的典型问题。通过对比浏览器、Postman和curl的工具行为差异,结合Nginx日志与Wireshark抓包,揭示了问题根源在于网络架构中HTTPS请求被意外“降级”为HTTP传输,导致SSL握手失败。文章重点探讨了curl工具严格验证机制暴露的`Peer's Certificate issuer is not recognized`错误,并提供了网络配置修正方案与标准化测试流程。

u9v0w的博客 279

从零到一:手把手教你用Python搭建医学影像识别CNN模型(附完整代码)

本文详细介绍了如何使用Python和TensorFlow/Keras从零开始构建一个医学影像识别的CNN模型,涵盖数据预处理、模型架构设计、训练调优及部署全流程。通过实战案例和完整代码,帮助开发者快速掌握深度学习在医学影像识别中的应用,特别适合医疗AI领域的初学者和研究者。

spark7igniter的博客 200

【算法设计与分析】实验7:复杂装载及0/1背包问题的回溯法设计与求解

通过本次实验,我对回溯法有了更深刻的理解。回溯法通过递归的方式,逐步构建问题的解空间,并在搜索过程中使用剪枝函数来避免无效搜索,从而提高搜索效率。这种方法在解决组合优化问题时非常有效,尤其是在解决解空间较小或可以通过剪枝显著减少搜索空间的一类问题时。

m0_73970214的博客 1209

OpenCV视频防抖算法实现与优化指南

本文详细解析了如何使用OpenCV实现视频防抖算法。通过特征点检测与光流跟踪估算帧间运动,利用滑动平均平滑运动轨迹,并应用仿射变换重塑视频帧。文章提供了完整的代码实现、参数调优指南及黑边处理等优化技巧,帮助开发者高效处理手持拍摄等场景下的视频抖动问题。

weixin_29062823的博客 341

Java语言描述:回溯法之最优装载问题

问题描述: 有一批共有 n 个集装箱要装上两艘载重量分别为 c1 和 c2 的轮船,其中集装箱 i 的重量为 w[i], 且重量之和小于(c1 + c2)。装载问题要求确定是否存在一个合理的装载方案可将这 n 个集装箱装上这两艘轮船。如果有,找出一种装载方案。例如,当n=3,c1=c2=50,且w=[10,40,40]时,可将集装箱1和集装箱2装上一艘轮船,而将集装箱3装在第二艘轮船;如果w=[

kinGlory 2891

光学传播仿真软件:ASAP_(1).ASAP软件介绍与安装

ASAP(Advanced System for Analysis and Propagation)是一款强大的光学传播仿真软件,广泛应用于光学系统的设计、分析和优化。它提供了丰富的建模工具和仿真功能,可以帮助用户从简单的光学元件到复杂的光学系统进行仿真。:支持光学、机械、热学等多物理场的联合仿真。:采用高精度的算法,确保仿真结果的准确性。:内置了大量的光学元件,如透镜、反射镜、棱镜、光栅等。:提供直观的用户界面,支持多种建模和仿真方式。:支持使用脚本语言进行二次开发,增强软件的定制能力。

kkchenjj的博客 1593

PCL 动态半径滤波【2025最新版】

使用PCL实现的2022年最新SCI论文——【Design of Dust-Filtering Algorithms for LiDAR Sensors Using Intensity and Range Information in Off-Road Vehicles】 一文中提出用于自动驾驶点云剔除粉尘、雨雪等影响因素导致的噪声点滤波算法。

点云侠的博客 1473

集装箱装载问题-回溯法解决

1.算法设计 一.回溯法是一个搜索了所有的解空间的算法,在搜索的过程中通过具体问题条件不断选优判断,最后达到一个合适的目标或者全部搜索仍无想要的答案。它是通过分步的方法进行搜索,当当前这一步无法达到目标解,就回退一步,尝试其他的路径就像搜索目标解,这个搜索的过程就叫做回溯法。 在本题中搜索所有集装箱装载的方法,在这过程中当满足不超过容量且在相等重量时,取装载集装箱个数少的装载,此为本提的搜索所...

CAOSONGSONG_的博客 2823

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

回溯法解决装载问题

/******************************************************************** * MAIN.CPP 文件注释 * 文件路径: D:\EVERBOX\SOURCE CODE\贪心法\装载问题/ * 作者 : 杨帆 江南大学 计科0905 * 创建时间: 2011/12/4 20

杨帆的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

分支限界法之最优装载问题

开篇 装载问题已经说过很多种解决方案了,在这里就不再次重复问题了,动态规划,贪心,回溯法都可以解决,今天我们来说一种新的方法——分支限界法。 分支限界法 什么是分支限界法呢?分支限界法类似回溯法,也是在问题的解空间上搜索问题解的算法。一般情况下,分支限界法与回溯法的求解目标不同,回溯法的求解目标是找出解空间中满足约束条件的所有解,而分支限界法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或者极小的解,即在某种意义下的最优解。 这听起来有点像广度优先遍历,其实它的实

weixin_44755413的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java装载问题回溯法,回溯算法之轮船货箱装载问题(最优装载)

1. 问题描述:给定 n 个货箱,货箱 i 重为 wi,船可以装载的货箱总重量为W。货箱装载问题是在不使船翻的前提下装载尽可能多的货箱。2. 解空间:假设解可以由向量 (x1, x2, ... , xn) 表示, xi 属于 {0, 1} , xi = 1 表示货箱 i 被装上船, xi = 0 表示货箱 i 不装上船。3. 约束函数:令 cw(i) 表示到第 i 层的当前总重量,则约束函数为 ...

weixin_32700139的博客 1585

回溯法——装载问题

描述 有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。   输入 多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n   输出 对于每个测例在单独的一行内输出Yes或No。   输入样例 7 8 2 8 7 7 9 2 8 8 0 0 0

sayniceoh的博客 1305

回溯法之装载问题(初级)

问题描述:求解简单装载问题。设由一批集装箱要装上一艘载重量为W的轮船,其中编号为i(0<=i<=n-1)的集装箱的重量为wi。现要从n个集装箱中选出若干个装上轮船,使它们的重量之和达到最高但不超过W。 回溯法:明显的深度优先搜索策略,可以理解为迪杰斯特拉算法走迷宫。 #include<iostream> using namespace std; class Loading { friend int MaxLoading(int w[], int c, int n); priv

m0_47634044的博客 1974

装载问题

装载问题 有n个集装箱,需要装上两艘载重分别为c1和c2的轮船。wi为第i个集装箱的重量,且W1+W2+…+Wn≤c1+c2 问:是否存在一种合理的装载方案把这n个集装箱装上船?如果有,请给出一种方案。 算法步骤: ·先将重量排序(从大到小) ·判断最重物能否放入大船中,能放入则c=c1=最大物重量(90)=62 ·判断第二重货物能否装入大船,80>62所以不行,考虑下一个货物,40<...

weixin_43700565的博客 787

【回溯法经典】装载问题(两艘船优化装箱)与代码详解

生活中常见的“如何最大化合理装箱”的问题,其实就是计算机领域的装载问题。本期分享一道经典的回溯法问题:有两艘船和若干箱子,如何使装船的方案满足各自载重又尽可能优化?本文不仅有详细讲解,还有C语言代码实现!赶快来看看有没有帮助你的地方!这道题是典型的集合分割+约束满足问题,非常适合练习回溯法及剪枝思想。理解后,对解决类似背包、划分等问题大有帮助。

2301_79062072的博客 547

语言回朔法图的着色问题_经典问题-回溯法-装载问题

写在前面:感谢飞哥提出的问题,让我认识到自己对算法课本的忽视。这可是基础呀,从现在开始补吧!!!文章内容不免有错误和不足之处,欢迎大家指出,共同学习。1 相关知识点1.1什么是回溯法 基本思想:把问题的解空间转化为图或者树的结构,然后使用深度优先搜索策略进行遍历,再遍历的过程中记录和寻找所有可行解或者最优解; 1.2什么是子集树 所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解...

weixin_39669075的博客 89

装载问题-算法(回溯法)

装载问题 有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。 采用回溯法一次从第一个货物到最后一个货物,最后行判断,哪一种最优这里写代码片 public class Load { /** * @param args */ int c1=40,c2=50;

zpDreamer的博客 3951
上一篇: 回溯法经典例题--0/1背包问题--C语言
下一篇: 回溯法经典例题--n皇后问题--C语言
Max饼干碎
博客等级 码龄5年 28粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值