回溯法经典例题--求解装载问题--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

URScript介绍

优傲机器人(Universal Robots)是丹麦工业协作机器人制造商,2005年成立,2015年被泰瑞达收购。其自研编程语言URScript基于Python语法,专为机器人控制优化,支持运动指令、IO控制等功能,具有类Python的简洁语法和实时性特点。URScript提供丰富的API,支持变量赋值、条件判断、循环及函数定义等编程结构,参数按值传递。用户可通过该语言在Polyscope界面编写程序,实现自动化任务。目前优傲在全球20多个办事处为多国客户提供服务。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 603

分离与合体题解(区间DP)

题目: 经过在机房里数日的切磁,LYD从社神牛那里学会了分离与合体,出关前,杜神牛给了他一个测试 杜神牛造了个区域,它们紧邻着排成了一行,编号1-n。在这經个区域里都放着一把OI界 的金钥匙,每一把都有一定的价值,LYD当然想得到它们了。然而杜神牛规定LYD不可以一下子 把它们全部拿走,而是每次只可以拿一把。为了尽快地拿到所有的金钥匙,LYD自然就用上了刚学的分离与合体特技。 开始LYD可以选择从1~n-11~n-11~n-1的任何一个区域(记为K)进入,进入后LYD会在K区域发 生分离,从而分离为两个小L

cqbz_lipengcheng的博客 371

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

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

weixin_28695903的博客 1496

从零搭建Synopsys EDA环境:Ubuntu系统下的完整安装与避坑指南

本文详细介绍了在Ubuntu系统下从零搭建Synopsys EDA环境的完整流程,包括系统配置、安装文件准备、核心工具安装、License配置及常见问题排查。特别针对数字IC设计场景,提供了VCS、Verdi、Design Compiler等EDA Tools的安装避坑指南和性能优化建议,帮助开发者高效搭建稳定的开发环境。

weixin_33738982的博客 491

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

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

sc2333的博客 2836

rk3576之imx415 4k@60fps

1;0;1;0;1;0;1;0;1;0;1;0;1;0;

darennet的专栏 705

UCIE Specification详解(三)

Protocol Layer(协议层)以及Die-to-Die Adapter

Crazzy_M的博客 1764

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

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

m0_73970214的博客 1209

eye-in-hand手眼标定系统

上一个博文说了一种手眼标定系统的特殊情况,就是相机随着机械手一起移动的情况。虽然前面简单介绍了一种办法,就是内次拍照时让相机回到之前标定的位置,但是这样处理机器人的工作效率就会大大降低,产生很多重复动作,所以这篇博文就来讲一种更简单的标定方案。 下面是halcon官方给的手眼标定系统的案例代码。 这个例子主要应用于相机固定在机械手末端的手眼系统中,而且标定板相对于机器人也是静止的。 在这...

二毛的博客 1万+

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

Testbench编写:激励生成、响应监控、仿真时间控制

本文介绍了Verilog/VHDL Testbench的核心技术,重点阐述了激励生成、响应监控和仿真时间控制三大关键环节。通过时钟生成、复位信号生成等具体代码示例,展示了如何有效构建测试平台。文章还总结了波形输出、自动检查等验证方法,并提出了模块化设计、自动化检查等最佳实践,帮助开发者提升FPGA仿真效率和验证质量。这些技术要点为数字电路设计的正确性验证提供了系统化的解决方案。

2301_79143213的博客 111

使用STM32H7点亮RGB屏幕

希望本文能对你有所帮助!RGB屏幕是一种具有红、绿、蓝三种颜色通道的显示设备,通过控制每个通道的亮度,可以显示出丰富多彩的图像和动画。要使用STM32H7控制RGB屏幕,我们需要连接适当的引脚,并编写适当的代码来控制每个颜色通道的亮度。在主循环中,我们先点亮红色通道,然后延迟一段时间,接着点亮绿色通道,再延迟一段时间,最后点亮蓝色通道,并再次延迟。需要注意的是,示例代码中的延迟循环使用了一个简单的计数器实现,但实际应用中可能需要更精确的延迟方式,例如使用定时器中断或操作系统提供的延迟函数。

QoyOle的博客 924

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

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

CAOSONGSONG_的博客 2823

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

回溯法解决装载问题

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

杨帆的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

weixin_44755413的博客 1万+

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

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

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、付费专栏及课程。

余额充值