第5章 回溯法,装载问题

【回溯算法】装载问题 【问题描述】 给定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, …, 阅读详情
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define MAX 100

int c1, c2;		//两船的载重量
int n;			//货物数量
int w[MAX];		//货物重量
int maxw;		//最大装载量
bool finished;	//已达到装载最大量时,finished为true

void Backtrack(int k, int cw, int upperBound)
{
	if (k == n)
	{
		if (cw > maxw)
		{
			if ((maxw = cw) == c1)
			{
				finished = true;
			}
		}
	}
	else
	{
		if (cw + w[k] <= c1) //约束条件:是否还能装下货物w[k]
		{
			Backtrack(k+1, cw+w[k], upperBound);
			
			if (finished)
			{
				return;
			}
		}

		if (upperBound - w[k] > maxw) //限界条件:剩余货物的最优装载是否比当前的最优装载更好
		{
			Backtrack(k+1, cw, upperBound-w[k]);
			
			if (finished)
			{
				return;
			}
		}
	}
}

int main(void)
{
	while(scanf("%d%d", &c1, &c2) != EOF) //两艘船的装载量
	{
		scanf("%d", &n); //货物数量
		
		int totalw = 0;
		int i;
		for (i = 0; i < n; i++)
		{
			scanf("%d", &w[i]); //每个货物的重量
			totalw += w[i];
		}
		maxw = 0;
		finished = false;
		Backtrack(0, 0, totalw);
		if (totalw - maxw <= c2) //船2是否能装下剩余货物
		{
			printf("ship 1:%d\tship 2:%d\t", maxw, totalw-maxw);
			puts("OK!");
		}
		else
		{
			puts("NO!");
		}
		putchar('\n');
	}
	return 0;
}

/*
5 5
5 2 2 2 2 1
5 5
5 2 2 2 2 2
50 50
3 40 10 30
50 50
3 40 10 40
49 50
3 40 10 49
50 49
3 49 40 10
36 16
8 8 2 5 6 3 6 7 11
*/

0027算法笔记——【回溯法】回溯法与装载问题 1、回溯法      (1)描述:回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。      (2)原理: 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的 阅读详情

相关推荐

【回溯法】简单装载问题与复杂装载问题

[问题描述] 有n个集装箱要装上一艘载重量为W的轮船,其中集装箱i ( 1≤i≤n)的重量为wi。不考虑集装箱的体积 限制,现要这些集装箱中选出若干装上轮船, 使它们的重量之和等于W ,当总重量相同时要求选取的集装箱个数尽可能少。 对于第i层的某个分枝结点,对应的调用状态是dfs (num, tw, rw, op,i) ,对应的扩展结点有2个: ●选择第i个 ➢op[i]=1 , num=num+1, tw=tw+w[i], rw=rw-w[i],转到下一个状态dfs(num, tw, rw,op..

小k要加油的博客 1万+

回溯算法(1)--装载问题和0-1背包

回溯法的策略,怎样使用回溯法,对于简单的和复杂的装载问题如何使用回溯法,不用动态规划法,而使用回溯法计算0-1背包问题。

NPU 研0 3303

装载问题的回溯法解决 C语言方法 子集树解法

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

qq_39897978的博客 7775

回溯法,回溯法解装载问题

一、回溯法有“通用的解题法”之称,可以系统的搜索一个问题的所有解或任一解。它在问题的解空间中按深度优先策略,从根节点出发,搜索解空间树。算法搜索至解空间树的任一节点时,先判断该节点是否包含问题的解,如果肯定不包含则跳过对以该节点为根的子树的搜索,回到其父节点回溯。否则,进入该子树,继续按深度优先策略搜索。 利用回溯法解问题时一般按以下三步骤: 1)定义问题的解空间; 2)确定易于搜索的解空间

alang080912的专栏 7041

回溯法的一个应用:最优装载问题

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

qq_41926985的博客 5203

算法设计——装载问题(两轮船)(回溯)

问题 要求确定一个合理的装载方案将n个集装箱装入两艘船,如果有,找出一种方案 分析 我们之前用贪心做过一艘船的最优装载问题(将尽可能多的集装箱装入),即将重量小的集装箱先装。 那么我们看看这个题,如果用贪心的话能不能做出来。 假设两艘船载重量为100 100, 假设有5个物体,重量为20 30 40 50 60,如果我们用贪心算法,那么第一艘船装入的物品为 20 30 40,共三个 那么另一艘船...

Doro_的博客 6049

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

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

StarPrayers.的博客 4741

回溯法解装载问题-5迭代回溯

5. 迭代回溯 #include "stdafx.h" #include <iostream> #include <fstream> #include <string> using namespace std; // 迭代回溯 template <class Type> Type MaxLoading(Type w[],Type c,int n,int bestx[]){ // 返回最优装载量及其相应解,初始化根节点 int i=1,

宋老师的课程相关资料 885

@全体成员 各位同学,第5章回溯法5.1节+5.2节的PPT已上传至群,请大家下载学习。今天晚上看一下PPT中装载问题求解的例子和算法,明天做这个实验。明天算法实验的题目:基于回溯法的装载问题实

cout << "最大装载重量: " << bestWeight << endl;cout << "选择的货物编号: ";// 不选择当前货物。

2301_79488747的博客 219

从零搭建A股量化交易系统:开源框架选型与实战部署指南

本文详细介绍了从零搭建A股量化交易系统的完整流程,重点分析了开源框架VNPY和QMT的选型与实战部署。内容涵盖系统架构设计、策略开发、性能优化及实盘过渡方案,为开发者提供了一套完整的A股实盘量化交易解决方案,助力高效构建稳定可靠的量化交易系统。

sugar的博客 1271

Zotero插件安装保姆级教程:从Jasminum到Sci-Hub,一站式搞定文献管理

本文提供Zotero插件安装的保姆级教程,从Jasminum到Sci-Hub,一站式搞定文献管理。通过详细配置和实战案例,帮助用户高效构建文献工作流,提升研究效率。重点介绍了元数据抓取、PDF管理、文献分析和知识产出等关键插件的使用方法。

weixin_42531516的博客 169

回溯法求解装载问题

问题描述 有n个集装箱要装上一艘载重量为W的轮船,其中集装箱i(1≤i≤n)的重量为wi。不考虑集装箱的体积限制,现要从这些集装箱中选出重量和小于等于W并且尽可能大的若干装上轮船。 例如,n=5,W=10,w={5,2,6,4,3}时,其最佳装载方案是(1,1,0,0,1)或者(0,0,1,1,0),maxw=10。 问题求解 采用带剪枝的回溯法求解。问题的表示如下: int w[]={0,5,2...

LixDemon的博客 6715

SFF-8654接口引脚定义全解析:从SAS到U.2的高速硬件连接核心

在高速数据存储与传输领域,接口标准是连接主机与存储设备、确保信号完整性与协议互通性的物理基础。其核心原理在于通过精确定义的物理引脚和电气特性,承载不同的高速串行通信协议,如SAS和PCIe。这类高密度连接器的技术价值在于以紧凑的形态支持多协议兼容与高速率传输,满足了企业级存储、高性能计算对带宽和可靠性的苛刻要求。典型的应用场景包括服务器硬盘背板连接、NVMe U.2固态硬盘直连以及外部存储扩展。本文聚焦于SFF-8654(亦称Mini SAS HD)这一关键接口,深入剖析其引脚定义、信号分区(如高速数据通道

weixin_29188043的博客 707

回溯法解装载问题

 1、回溯法     (1)描述:回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。     (2)原理: 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,...

田野中的锋芒 1万+

深度学习模型设计的方法和技巧

设计神经网络模型是一个迭代的过程,需要不断试验和调整各个组成部分,以达到最佳性能。同时,遵循良好的工程实践,如模块化设计、版本控制、文档记录等,也是成功的关键。

xw555666的博客 4026

零代码实战:基于Coze平台打造测试用例生成AI助手

本文详细介绍了如何利用Coze平台零代码打造测试用例生成AI助手,通过智能体和工作流配置,实现需求文档自动解析与结构化测试用例生成。该方案显著提升测试效率,特别适合敏捷开发中频繁变更的需求场景,帮助测试工程师快速应对挑战。

weixin_42526015的博客 209

回溯法 | 求解装载问题

问题描述: 有 n 个集装箱要装上一艘载重量为 W 的轮船,其中集装箱 i (1<=i<=n) 的重量,为wi。子啊装在体积不受限制的情况下,将尽可能重的集装箱装上轮船,当重量相同时要求选取的集装箱个数尽可能少,编写一个实验程序采用回溯法求解。要求采用适当的剪枝条件提高效率,左孩子结点剪枝的条件是只装载满足重量要求的集装箱,右孩子结点剪枝的条件是至多要选中 3 个集装箱。 例如,...

cong____cong的博客 6119

unity shader 后处理实现水墨风格渲染「Low Poly 」变「水墨画 」

水墨风格渲染 这次学校的比赛打算做一个中国古代背景的游戏,所以尝试做了水墨风格的渲染。 主要按以下四步来实现的效果: 根据色调和饱和度调整饱和度。 对图像进行模糊 水墨风格的物体边缘 物体内画笔笔触的模拟 接下来我分别就这四步依次展开说明: 调整饱和度 这里我使用Post-Processing Stack 的Color Grading 来调节饱和度,通过使用Grading Curv...

九级铁甲蛹的博客 1万+

装载问题 ——回溯法(Java)

装载问题 ——回溯法(Java)

优快云2022博客之星Top39;华为云博主7&,优快云、稀土掘金、微信公众号、阿里云开发者社区、腾讯云社区、博客园、知乎、51CTO同名博主WHYBIGDATA; 2862

检测头篇 | 手把手教你如何去更换YOLOv8的检测头为ASFF_Detect

自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv8的检测头更换为ASFF_Detect。🌈

小哥谈 2497

【Cmder】--- Windows11 配置CMD神器 (超详细 持续更新中)

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1万+

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

一、问题描述 有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中第i个集装箱i的重量为w[i],要 求确定是否有一个合理的装载方案可将这些集装箱装上这2艘轮船。如果有,找出一种 装载方案。 二、问题分析 (1) n个集装箱的重量之和肯定小于等于2艘轮船的载重量c1+c2,不然不可能全部装入,即∑w[i] <= c1 + c2。 (2) 为将所有集装箱装入2艘轮船,我们无需考虑如何将集装箱分配到2艘轮船,只需考虑如何将1艘轮船尽可能装满。第1艘轮船能最大程度装满,第2艘轮船能装下就是能装下,装不

qq_44890213的博客 4571

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

装载问题(回溯法过程和方案选取)

装载问题(回溯法过程和方案选取) 一、问题描述 有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且 装载问题要求确定,是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。 二、问题分析 主要思想:将第一艘船尽可能装满,剩余的装入第二艘船。 1.n和t是什么? n是解向量的分量的个数,t指的是当前要确定第t个分量...

哈哈哈哈哈哈哈哈的博客 6765

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

回溯法求解简单装载问题

问题描述:有一批集装箱要装上一艘载重量为W的轮船,其中编号为i(0<= i<=n-1)的集装箱的重量为wi。现要从n个集装箱中选出若干个装上轮船,使得他们的重量之和恰好为W。如果找到任何一种解,返回true,否则返回false。 思路:其实这道题运用了回溯法一个非常明显的特点,就是剪枝法。也就是狭义回溯法定义“回溯法=DFS+剪枝法”;另一种广义定义就是递归喽。 #include<iostream> using namespace std; int w[] = { 0,5,2,6,4

lxy99的博客 4783

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

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

weixin_28695903的博客 1495

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
上一篇: 字符串——Ny 308 Substring
下一篇: 第5章 回溯法,批处理作业调度
庞老板
博客等级 码龄15年 127粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

庞老板

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

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

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

打赏作者

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

抵扣说明:

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

余额充值