[递归回溯枚举] 装载问题

装载问题

题目描述

有一批共 n 个集装箱要装上 2 艘载重量分别为 c1和 c2的轮船,其中集装箱 i 的重量为 wi,且

装载问题要求确定,是否有一个合理的装在方案可将这 n 个集装箱装上这 2 艘轮船。如果有,找出最优装载方案。

关于输入

输入要输入
1、集装箱数量 类型整型
2、集装箱重量数组 类型整型数组
3、两艘轮船的载重量 类型整型数组
输入格式如:
5
67 34 2 69 24
78 158

关于输出

如果能装载的话输出格式如下:
ok,can load it
a way is:
the first trip load:2 69
the second trip load:67 34 24
如果不能装载的话输出如下:
can't find a way to Loading

例子输入
5
67 34 2 69 24
78 158
例子输出
ok,can load it
a way is:
the first trip load:2 69
the second trip load:67 34 24
提示信息

100% 测试数据保证n<=25。最优装载问题采用算法:尽量将第一艘轮船装满,然后将剩余的集装箱装到第二艘轮船上。

解题分析

尽量将第一个集装箱装满是为了保证我们尽可能地多利用第一个集装箱,而不造成容量的浪费。显然,我们可以用一个bool类型的数组,利用递归回溯的方法,用0表示不取该物品,用1表示取该物品,不断地去枚举所有可能的情况,并且,适当地做出减枝的操作,就是说我们判断一下当前第一艘船的容量能不能装下该物品,如果不能的话就不考虑装下该物品的情况了。当我们枚举完全部的情况后,我们去判断剩下的物品能不能被第二艘船装下,如果能就说明这是一种可行的方案,并且我们输出这个方案。

使用深度优先搜索(DFS)算法来解决最优装载问题。

程序首先读取输入,包括集装箱数量n、集装箱重量数组w[]和两艘轮船的载重量数组c1和c2。然后,定义一个全局变量wc1来记录尽量装满第一艘轮船时的重量,并定义两个布尔型数组w1[]和ans[],分别记录装载方案和最优装载方案。

然后,程序进入dfs()函数,dfs()函数用于遍历所有可能的装载方案。它的参数有step和content,其中step表示当前遍历到的集装箱序号,content表示当前第一艘轮船的剩余载重量。

如果step等于集装箱数量n+1,表示已经遍历完所有集装箱,此时判断当前装载的重量是否小于wc1,如果小于,将当前装载重量作为wc1,并将当前装载方案记录在ans[]数组中。

如果step不等于集装箱数量n+1,表示还没有遍历完所有集装箱,则遍历所有的可能情况。将集装箱放入第一艘轮船(w1[step]=1)或不放入第一艘轮船(w1[step]=0),然后递归调用dfs()函数,更新step为step+1,更新content为content减去当前集装箱的重量(w[step]),继续遍历下一个集装箱。

最后,主函数根据最优装载方案ans[]的内容,判断是否存在合理的装载方案。如果第一艘轮船的重量小于等于c1,且第二艘轮船的重量小于等于c2,则存在合理的装载方案。程序输出"ok,can load it"表示存在装载方案,并输出该方案的具体内容。如果不存在合理的装载方案,则输出"can't find a way to Loading"。

需要注意的是,程序将两艘轮船的载重量分别存在c1和c2中,但在判断最优装载方案时,使用的是第二艘轮船的剩余载重量sumc2。当sumc2小于等于c2时,表示第二艘轮船可以装载集装箱,否则表示第二艘轮船无法装载所有集装箱。

代码实现
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;int n,w[1000],c1,c2;
int wc1=1e9;
bool w1[1000];
bool ans[1000];void dfs(int step,int content){if(step==n+1){if(content<wc1){wc1=content;for(int i=1;i<=n;i++){ans[i]=w1[i];}}return;}for(int i=0;i<2;i++){if(i==0 && w[step]<=content){w1[step]=1;dfs(step+1,content-w[step]);}else{w1[step]=0;dfs(step+1,content);}}
}int main() {scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&w[i]);}scanf("%d%d",&c1,&c2);dfs(1,c1);int sumc2=0;for(int i=1;i<=n;i++){if(ans[i]==0){sumc2+=w[i];}}if(sumc2<=c2){printf("ok,can load it\na way is:\nthe first trip load:");int flag=0;for(int i=1;i<=n;i++){if(flag==0 && ans[i]==1){printf("%d",w[i]);flag=1;}else if(ans[i]==1){printf(" %d",w[i]);}}printf("\nthe second trip load:");flag=0;for(int i=1;i<=n;i++){if(flag==0 && ans[i]==0){printf("%d",w[i]);flag=1;}else if(ans[i]==0){printf(" %d",w[i]);}}printf("\n");}else{printf("can't find a way to Loading\n");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2659447.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【idea】运行工程时候卡了许久Java Method Breakpoints

老以为是数据库连接不上&#xff0c;此问题概率性小&#xff0c;操作上面不小心打了断点… 应该是打断点的时候&#xff0c;打到了方法上面&#xff0c;去掉哟 Java Method Breakpoints

文件过大放不了U盘?三个方法非常简单~

文件过大放不了U盘我们可以从文件过大这个角度来解决一下这个问题&#xff0c;可以借助一些工具把文件压缩后&#xff0c;体积变小后&#xff0c;再放入U盘&#xff0c;使得u盘得到高效的利用&#xff0c;下面是推荐的一些好用的软件。 一、嗨格式压缩大师 是一款可以压缩多种…

干货!一文详解车间管理的五大基本方法

车间管理是制造型企业生产过程中的重要环节&#xff0c;它直接影响着企业的生产效率、成本控制、产品质量以及员工的士气与工作效率。优秀的车间管理不仅能够提升产品的质量和生产力&#xff0c;还能降低运营成本&#xff0c;从而在激烈的市场竞争中为企业赢得优势。 为了帮助…

1.3MySQL中的自连接

自己的表和自己连接&#xff0c;核心&#xff1a;一张表拆为两张一样的表。 语法&#xff1a;select 字段列表 from 表 [as] 表别名1,表 [as] 表别名2 where 条件...; 关于怎样把一个表拆分成一个表&#xff0c;只要给它们分别取别名就行 categoryidpidcategoryname21信息…

ai写作生成器哪个好用?值得推荐这几款

随着人工智能技术的不断发展&#xff0c;AI写作生成器逐渐成为了写作领域的新宠。这些软件利用机器学习和自然语言处理等技术&#xff0c;能够自动生成高质量的文章&#xff0c;为写作者提供了极大的便利。在国内&#xff0c;也涌现出了许多优秀的AI写作软件。本文将介绍几款国…

16-网络安全框架及模型-BiBa完整性模型

目录 BiBa完整性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 应用场景 BiBa完整性模型 1 背景概述 Biba完整性模型是用于保护数据完整性的模型&#xff0c;它的主要目标是确保数据的准确性和一致性&#xff0c;防止未授权的修改和破坏。在这个模型中&#…

事务的简介

一、什么是事务 事务是一组数据库的操作序列&#xff0c;包含一个或多个sql操作命令&#xff08;增删改&#xff09;&#xff0c;事务将所有的操作命令看做一个不可分割的整体&#xff0c;向数据库系统提交或撤销操作&#xff0c;所有操作要么执行要么不执行。 ●事务是一种机…

Apache OFBiz RCE漏洞复现(CVE-2023-51467)

0x01 产品简介 Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。 0x02 漏洞概述 漏洞成因 该系统的身份验证机制存在缺陷,可能允许未授权用户通过绕过标准登录流程来获取后台访问权限。此外,在…

如何借助边缘网关打造智慧配电房安全方案

配电房是电力系统的重要组成部分&#xff0c;通常设置有各种高压配电装置和箱柜&#xff0c;是企业安全管理的重点。传统的人工巡检和监控总是难以避免疏漏&#xff0c;导致风险隐患的产生和扩大。 随着物联网、边缘计算、设备联动控制等技术的普及应用&#xff0c;佰马针对配电…

消费升级:如何通过服务升级吸引消费者

在当今竞争激烈的市场环境中&#xff0c;企业必须不断创新和改进&#xff0c;以吸引和留住消费者。其中&#xff0c;升级服务已成为企业提升竞争力的重要手段。本文将通过分析一家成功通过升级服务吸引消费者的企业&#xff0c;探讨其背后的策略和经验。 这家企业以其卓越的服务…

原生微信小程序如何动态配置主题颜色及如何调用子组件的方法

一、最终效果 二、步骤 1、在初始化进入项目时&#xff0c;获取当前主题色 2、把主题色定义成全局变量&#xff08;即在app.js中设置&#xff09; 3、tabBar也需要定义全局变量&#xff0c;在首页时需要重新赋值 三、具体实现 1、app.js onLaunch () {//获取主题数据this.set…

TSINGSEE青犀智能分析网关V4人体行为检测算法在视频监控中的应用

旭帆科技智能分析网关的算法十分繁多&#xff0c;其中可分为人体事件、车辆事件、环境事件、行为检测、着装检测等等&#xff0c;可覆盖绝大多数场景&#xff0c;如智慧校园、智慧工地、智慧景区等&#xff0c;今天小编就TSINGSEE青犀智能分析网关的行为检测算法和大家进行研讨…

狗笼,预计2028年将以 6.2%的复合年增长率增长

对于想要为爱犬提供安全舒适空间的宠物主人来说&#xff0c;狗笼是必不可少的宠物配件。由于宠物主人的数量不断增加以及人们对宠物安全和福祉的意识不断增强&#xff0c;狗笼市场一直在稳步增长。 全球市场分析&#xff1a;全球狗笼市场预计从 2021 年到 2028 年将以 6.2% 的复…

ubuntu 在线安装 python3 pip

ubuntu 在线安装 python3 pip 安装 python3 pip sudo apt -y install python3 python3-pip升级 pip python3 -m pip install --upgrade pip

具有出色的数据速率、SI8642BA-AUR、SI8642BB-AS1R、SI8641BB-B-IUR、SI8635BD-B-ISR低功耗数字隔离器

一、简介 Si86xx 超低功耗数字隔离器系列是CMOS器件&#xff0c;与传统隔离技术相比&#xff0c;具有出色的数据速率、传播延迟、功耗、尺寸、可靠性和外部BOM优势。这些产品的工作参数在宽温度范围内和整个设备使用寿命内保持稳定&#xff0c;便于设计和高度统一的性能。所有…

创建您的第一个记忆卡片游戏

大家好&#xff01;今天&#xff0c;我们将一起探索如何用HTML、CSS和JavaScript创建一个有趣的记忆卡片游戏。我们的游戏规则很简单&#xff1a;用户需要找到一对一样的卡片。如果你是编程新手&#xff0c;不用担心&#xff0c;我会逐步引导你完成这个项目。 正文&#xff1a…

易趋产品升级(EasyTrack 11_V1.3) | 集成飞书、WPS、个性化设置,增强团队协作和用户体验

企业在项目管理过程中&#xff0c;经常会遇到项目信息同步不及时、沟通障碍以及管理软件使用不便捷等难题&#xff0c;导致团队协作效率低下。这种情况下&#xff0c;如果使用了多个办公软件&#xff08;如&#xff1a;钉钉、企业微信、项目管理软件等&#xff09;&#xff0c;…

子类能继承父类的那些内容

子类能继承父类的那些内容 子类不能继承父类的构造方法。 package oop.Extends.a02oopextendsdemo02; public class Test {public static void main(String[] args) {}class Fu{String name;int age;public Fu() {}public Fu(String name, int age) {this.name name;this.ag…

HarmonyOS4.0开发应用(四)【ArkUI状态管理】

ArkUI状态管理 分为以下四个: StateProp和LinkProvide和ConsumeObserved和ObjectLink State 相当于vue中data()内定义的属性变量&#xff0c;相当于react中useState()的使用,即绑定在视图上的响应式变量&#xff0c;可动态更新~ Tip: 标记的变量必须初始化&#xff0c;不可为空…