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

装载问题

题目描述

有一批共 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

14 Arbitration in sequencer(仲裁)

uvm_sequencer 有一个内置机制&#xff0c;可以在sequencer上同时运行的sequence中进行仲裁。基于仲裁算法&#xff0c;sequencer将得到仲裁权的sequence的sequence_item发送到driver。 每个sequence发送的sequence_items也有自己的id来区别于其他sequence。 要设置特定的仲裁…

Apipost-Helper使用流程

Apipost-Helper是由Apipost推出的IDEA插件&#xff0c;写完接口可以进行快速调试&#xff0c;且支持搜索接口、根据method跳转接口&#xff0c;还支持生成标准的API文档&#xff0c;注意&#xff1a;这些操作都可以在代码编辑器内独立完成&#xff0c;非常好用&#xff01;这里…

JavaWeb——监听器Listener 过滤器Filter——韩顺平学习笔记

文章目录 JavaWeb 三大组件之监听器 ListenerListenerJavaWeb 的监听器ServletContextListener 监听器ServletContextAttributeListener 监听器其它监听器-使用较少HttpSessionListener 监听器HttpSessionAttributeListener 监听器ServletRequestListener 监听器ServletRequest…

泰迪智能科技分享:AI大模型发展趋势分析

大规模预训练语言模型&#xff0c;也被称为“大模型”或“基座模型”&#xff0c;其特点在于拥有巨大的参数量&#xff0c;构成了复杂的人工神经网络模型。大模型具有规模性&#xff08;参数量大&#xff09;、涌现性&#xff08;产生预料之外的新能力&#xff09;以及通用性&a…

uni-app condition启动模式配置

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

Java EE 网络原理之HTTP 响应详解

文章目录 1. 认识"状态码"(status code)2. 通过 form 表单构造 HTTP 请求3. 通过 ajax 构造 HTTP 请求 1. 认识"状态码"(status code) 表示了这次请求对应的响应&#xff0c;是什么样的状态 &#xff08;成功&#xff0c;失败&#xff0c;其他的情况&…

Graph Transformer2023最新研究成果汇总,附15篇必看论文

图Transformer是一种结合了Transformer模型和图神经网络&#xff08;GNN&#xff09;的框架&#xff0c;用于在图形结构数据上执行预测任务。在图Transformer中&#xff0c;Transformer的自注意力机制被用来学习节点之间的关系&#xff0c;而GNN则被用来生成节点的嵌入表示。通…

数据结构与算法(C语言版)P10——图

1、图的基本概念和术语 前面学过&#xff1a; 线性是一对一树形是一对多 而今天要学习的图形结构是多对多。 图的定义&#xff1a; G(V,E) V&#xff1a;顶点(数据元素)的__有穷非空__集合。E&#xff1a;边的有穷集合。 __有向图&#xff1a;__每条边都是有方向的 __无…

【linux】touch的基本使用

碎碎念 刚接触linux时候的几个最基础的命令之一&#xff0c;用来创建文件。如果使用touch --help的时候会发现作者对于touch的简介&#xff1a;Update the access and modification times of each FILE to the current time.用于修改文件的访问和时间戳 带我的leader属于那种…

rsync的介绍与使用

rsync的介绍与使用 一、简介 rsync&#xff08;remote synchronize&#xff09;是Liunx/Unix下的一个远程数据同步工具。它能够以非常高效的方式传输和同步文件&#xff0c;它可以将一个目录的文件快速地同步到另一个目录&#xff0c;还可以通过网络快速同步多台主机间的文件…

使用Python Flask搭建一个简单的Web站点并发布到公网上访问

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&#xff0c;本期教程…

springBoot整合redis做缓存

一、Redis介绍 Redis是当前比较热门的NOSQL系统之一&#xff0c;它是一个开源的使用ANSI c语言编写的key-value存储系统&#xff08;区别于MySQL的二维表格的形式存储。&#xff09;。和Memcache类似&#xff0c;但很大程度补偿了Memcache的不足。和Memcache一样&#xff0c;R…

TDengine 公布 2023 年发展“成绩”,六大亮点引人瞩目

今天&#xff0c;我们进行了 2023 年重大成就和发展成绩盘点&#xff0c;主要归纳为产品创新、市场发展、开源社区、生态建设、活动布道与奖项荣誉六大维度。在元旦前夕&#xff0c;我们也想把这份“2023 年成绩单”分享给所有关注 TDengine 的朋友们。 在今年&#xff0c;最值…

你好!Apache Seata

北京时间 2023 年 10 月 29 日&#xff0c;分布式事务开源项目 Seata 正式通过 Apache 基金会的投票决议&#xff0c;以全票通过的优秀表现正式成为 Apache 孵化器项目&#xff01; 根据 Apache 基金会邮件列表显示&#xff0c;在包含 13 个约束性投票 (binding votes) 和 6 个…

百分点科技成为中国“数据要素×”生态合作伙伴

12月24日&#xff0c;由中国经济体制改革研究会、中国电子、郑州市人民政府、中国经济改革研究基金会联合主办的中国“数据要素”生态大会在郑州召开&#xff0c;百分点科技受邀出席&#xff0c;并获颁中国“数据要素x”2024年度生态伙伴合作证书。 大会邀请了国家数据局党组成…

华天动力OA TemplateService 任意文件读取漏洞复现

0x01 产品简介 华天动力OA是一款将先进的管理思想、 管理模式和软件技术、网络技术相结合&#xff0c;为用户提供了低成本、 高效能的协同办公和管理平台。 0x02 漏洞概述 华天动力OA TemplateService接口处存在任意文件读取漏洞&#xff0c;未经身份认证的攻击者可利用此漏洞…

边缘计算网关:在智慧储能系统中做好储能通信管家

背景 目前储能系统主要由储能单元和监控与调度管理单元组成&#xff0c;储能单元包含储能电池组(BA)、电池管理系统(BMS)、储能变流器(PCS)等&#xff1b;监控与调度管理单元包括中央控制系统(MGCC)、能量管理系统(EMS)等。 2021年8月&#xff0c;国家发改委发布《电化学储能…

axios配置请求头content-type 和 get/post请求方式

axios配置请求头content-type https://blog.csdn.net/wojiushiwo945you/article/details/107653962 axios 是Ajax的一个插件&#xff0c;axios虽然是一个插件&#xff0c;但是我们不需要通过Vue.use(axios)来使用&#xff0c;下载完成后&#xff0c;只需在项目中引入即可。(一…

Frappe Charts:数据可视化的强大工具

一、产品简介&#xff1a; 一个简单、零依赖、响应式的 开源SVG 图表库。这个图表库无论是数据更新还是屏幕大小变化&#xff0c;都能快速响应并更新图表。数据生成和悬停查看都有舒服的交互动效&#xff0c;体验感很好。不仅支持配置颜色&#xff0c;外观定制也很方便。还支持…

c++学习笔记(13)-左值和右值

一、左值与右值 啥是左值和右值呢&#xff1f; 左值&#xff1a;在内存有确定存储地址、有变量名&#xff0c;表达式结束依然存在的值&#xff0c;简单来说左值就是非临时对象。 右值&#xff1a;就是在内存没有确定存储地址、没有变量名&#xff0c;表达式结束就会销毁的值&…