#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
*/
相关推荐
【回溯法】简单装载问题与复杂装载问题
[问题描述] 有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..
回溯算法(1)--装载问题和0-1背包
回溯法的策略,怎样使用回溯法,对于简单的和复杂的装载问题如何使用回溯法,不用动态规划法,而使用回溯法计算0-1背包问题。
装载问题的回溯法解决 C语言方法 子集树解法
一、问题描述 有一批共n个集装箱要装上2艘载重量分别为b1和b2的轮船,其中集装箱i的重量为wi,且,装载问题要求确定是否有一个合理的装载方案可将这些集装箱装上这2艘轮船且保证装的集装箱最重。如果有,找出一种装载方案。 二、大致思路 我们利用回溯法来解决,先来了解一下回溯法的算法框架: (1)问题的解空间 用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含问题的一个最优解。例如,对于...
回溯法,回溯法解装载问题
一、回溯法有“通用的解题法”之称,可以系统的搜索一个问题的所有解或任一解。它在问题的解空间中按深度优先策略,从根节点出发,搜索解空间树。算法搜索至解空间树的任一节点时,先判断该节点是否包含问题的解,如果肯定不包含则跳过对以该节点为根的子树的搜索,回到其父节点回溯。否则,进入该子树,继续按深度优先策略搜索。 利用回溯法解问题时一般按以下三步骤: 1)定义问题的解空间; 2)确定易于搜索的解空间
回溯法的一个应用:最优装载问题
上一篇我们介绍了回溯法。了解了回溯法的空间状态是树形结构。本篇介绍一个回溯法的一个应用:最优装载问题。 最优装载问题 我们在贪心法中介绍过最优装载问题,本篇是说它的加强版本。由于是加强版本,自然问题也变了,比原先的最优装载问题复杂了一些。原先问题是1艘轮船。而加强版的是2艘轮船 什么是加强版的最优装载问题 有n个集装箱,需要装上两艘载重为c1和c2的轮船。wi为第i个集装箱的重量,且w1+w2+…...
算法设计——装载问题(两轮船)(回溯)
问题 要求确定一个合理的装载方案将n个集装箱装入两艘船,如果有,找出一种方案 分析 我们之前用贪心做过一艘船的最优装载问题(将尽可能多的集装箱装入),即将重量小的集装箱先装。 那么我们看看这个题,如果用贪心的话能不能做出来。 假设两艘船载重量为100 100, 假设有5个物体,重量为20 30 40 50 60,如果我们用贪心算法,那么第一艘船装入的物品为 20 30 40,共三个 那么另一艘船...
回溯法——(1)装载问题(C语言讲解)
有一批共n个集装箱要装上2艘载重量分别为c1和c1的轮船,其中集装箱i重量为wi,且装载问题要求确定是否有一个合理的装载方案可将这一批集装箱装上这2艘轮船。如果有,找出一种装载方案。
回溯法解装载问题-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,
@全体成员 各位同学,第5章回溯法5.1节+5.2节的PPT已上传至群,请大家下载学习。今天晚上看一下PPT中装载问题求解的例子和算法,明天做这个实验。明天算法实验的题目:基于回溯法的装载问题实
cout << "最大装载重量: " << bestWeight << endl;cout << "选择的货物编号: ";// 不选择当前货物。
从零搭建A股量化交易系统:开源框架选型与实战部署指南
本文详细介绍了从零搭建A股量化交易系统的完整流程,重点分析了开源框架VNPY和QMT的选型与实战部署。内容涵盖系统架构设计、策略开发、性能优化及实盘过渡方案,为开发者提供了一套完整的A股实盘量化交易解决方案,助力高效构建稳定可靠的量化交易系统。
Zotero插件安装保姆级教程:从Jasminum到Sci-Hub,一站式搞定文献管理
本文提供Zotero插件安装的保姆级教程,从Jasminum到Sci-Hub,一站式搞定文献管理。通过详细配置和实战案例,帮助用户高效构建文献工作流,提升研究效率。重点介绍了元数据抓取、PDF管理、文献分析和知识产出等关键插件的使用方法。
回溯法求解装载问题
问题描述 有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...
SFF-8654接口引脚定义全解析:从SAS到U.2的高速硬件连接核心
在高速数据存储与传输领域,接口标准是连接主机与存储设备、确保信号完整性与协议互通性的物理基础。其核心原理在于通过精确定义的物理引脚和电气特性,承载不同的高速串行通信协议,如SAS和PCIe。这类高密度连接器的技术价值在于以紧凑的形态支持多协议兼容与高速率传输,满足了企业级存储、高性能计算对带宽和可靠性的苛刻要求。典型的应用场景包括服务器硬盘背板连接、NVMe U.2固态硬盘直连以及外部存储扩展。本文聚焦于SFF-8654(亦称Mini SAS HD)这一关键接口,深入剖析其引脚定义、信号分区(如高速数据通道
回溯法解装载问题
1、回溯法 (1)描述:回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。 (2)原理: 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,...
深度学习模型设计的方法和技巧
设计神经网络模型是一个迭代的过程,需要不断试验和调整各个组成部分,以达到最佳性能。同时,遵循良好的工程实践,如模块化设计、版本控制、文档记录等,也是成功的关键。
零代码实战:基于Coze平台打造测试用例生成AI助手
本文详细介绍了如何利用Coze平台零代码打造测试用例生成AI助手,通过智能体和工作流配置,实现需求文档自动解析与结构化测试用例生成。该方案显著提升测试效率,特别适合敏捷开发中频繁变更的需求场景,帮助测试工程师快速应对挑战。
回溯法 | 求解装载问题
问题描述: 有 n 个集装箱要装上一艘载重量为 W 的轮船,其中集装箱 i (1<=i<=n) 的重量,为wi。子啊装在体积不受限制的情况下,将尽可能重的集装箱装上轮船,当重量相同时要求选取的集装箱个数尽可能少,编写一个实验程序采用回溯法求解。要求采用适当的剪枝条件提高效率,左孩子结点剪枝的条件是只装载满足重量要求的集装箱,右孩子结点剪枝的条件是至多要选中 3 个集装箱。 例如,...
unity shader 后处理实现水墨风格渲染「Low Poly 」变「水墨画 」
水墨风格渲染 这次学校的比赛打算做一个中国古代背景的游戏,所以尝试做了水墨风格的渲染。 主要按以下四步来实现的效果: 根据色调和饱和度调整饱和度。 对图像进行模糊 水墨风格的物体边缘 物体内画笔笔触的模拟 接下来我分别就这四步依次展开说明: 调整饱和度 这里我使用Post-Processing Stack 的Color Grading 来调节饱和度,通过使用Grading Curv...
装载问题 ——回溯法(Java)
装载问题 ——回溯法(Java)
检测头篇 | 手把手教你如何去更换YOLOv8的检测头为ASFF_Detect
自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv8的检测头更换为ASFF_Detect。🌈
【Cmder】--- Windows11 配置CMD神器 (超详细 持续更新中)
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。
装载问题(回溯法)--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艘轮船能装下就是能装下,装不
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
装载问题(回溯法过程和方案选取)
装载问题(回溯法过程和方案选取) 一、问题描述 有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且 装载问题要求确定,是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。 二、问题分析 主要思想:将第一艘船尽可能装满,剩余的装入第二艘船。 1.n和t是什么? n是解向量的分量的个数,t指的是当前要确定第t个分量...
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
用c语言验证装载问题 回溯法,算法分析设计回溯法求解装载问题实验报告
《算法分析设计回溯法求解装载问题实验报告》由会员分享,可在线阅读,更多相关《算法分析设计回溯法求解装载问题实验报告(7页珍藏版)》请在人人文库网上搜索。1、回溯法求解装载问题 一、一、方法一般原理方法一般原理 回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选 解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘 若当前候选解除了还不满足问题规...
Java语言描述:回溯法之最优装载问题
问题描述: 有一批共有 n 个集装箱要装上两艘载重量分别为 c1 和 c2 的轮船,其中集装箱 i 的重量为 w[i], 且重量之和小于(c1 + c2)。装载问题要求确定是否存在一个合理的装载方案可将这 n 个集装箱装上这两艘轮船。如果有,找出一种装载方案。例如,当n=3,c1=c2=50,且w=[10,40,40]时,可将集装箱1和集装箱2装上一艘轮船,而将集装箱3装在第二艘轮船;如果w=[
1万+



被折叠的 条评论
为什么被折叠?



