首页 > 其他分享 >简单装载问题(回溯法)

简单装载问题(回溯法)

时间:2023-10-23 20:34:35浏览次数:35  
标签:剪枝 回溯 int 重量 集装箱 pathList 装载 简单

问题描述

有n个集装箱要装上一艘载重量为W的轮船,其中集装箱i ( 1≤i≤n )的重量为wi。不考虑集装箱的体积限制,现要这些集装箱中选出若干装上轮船, 使它们的重量之和等于W ,当总重量相同时要求选取的集装箱个数尽可能少。

  • 左剪枝条件

    已选集装箱的重总量 + 当前要选择的集装箱重量 ≤ 目标总量

    • 左剪枝是选择当前集装箱
  • 右剪枝条件

    已选集装箱的重总量 + (剩余集装箱重量 - 当前要选择的集装箱重量) ≥ 目标总量

    • 右剪枝是不选择当前集装箱。所以当排除当前集装箱, 剩下的集装箱加上已选集装箱的重量不足目标重量, 也就是说,即使把剩下的全部集装箱选上,都已经无法满足目标重量了,再继续搜索下去也没用了。所以直接回溯即可。
  • 符合剪枝条件即可向下一层继续搜索,直达不符合剪枝条件或者到达叶子节点;不符合剪枝条件就需要回溯

  • 递归出口

    当搜索到叶子节点,就代表得到解决方案了,此时结束函数调用。

static List<int> pathList = new List<int>();  //深度搜索路径

/// <summary>
/// 简单装载-回溯法
/// </summary>
/// <param name="w">集装箱列表</param>
/// <param name="tw">已选择的集装箱总重量</param>
/// <param name="rw">剩下的集装箱总重量</param>
/// <param name="d">递归深度</param>
static void dfs(int[] w, int tw, int rw, int d)
{
	if (d == w.Length)
	{
        //输出方案
		foreach (int item in pathList)
			Console.Write("{0} ", item);
		Console.Write("\n");
		return;
	}

	pathList.Add(1);
	if (tw + w[d] <= 10)  //左剪枝
	{
		dfs(w, tw + w[d], rw - w[d], d + 1);
	}
	pathList.RemoveAt(pathList.Count - 1);  //回溯

	pathList.Add(0);
	if(tw + rw - w[d] >= 10)  //右剪枝
	{
		dfs(w, tw, rw - w[d], d + 1);
	}
	pathList.RemoveAt(pathList.Count - 1);  //回溯
}

标签:剪枝,回溯,int,重量,集装箱,pathList,装载,简单
From: https://www.cnblogs.com/onerice/p/17783397.html

相关文章

  • JdbcTemplate基础【项目demo】【基础知识】【简单明了,一眼就会】
    jdbcTemplateDemo以便更好的应用。注意:实际大型项目中service层为复杂的逻辑处理,请自行编写。JdbcTemplate例子源码(含sql):http://www.shicishu.com/down/JdbcTemplate_Demo.rar第一部分:层级关系说明:1、controller层:对外接口层。(一般调用service层。)2、service层:逻辑处理层、(审核......
  • graalvmjs cube.js 集成简单说明
    实际上我以前也简单写过关于graalvm集成cube.js的,最近graalvmjs提供了独立的模块,我基于独立包创建了一个docker镜像尽管cube.js也提供了docker镜像,但是相对来说有点太重(包含了比较多的组件,同时很多是不需要的),很多时候我们是需要自己基于扩展开发的,以下是一个简单的集成(......
  • 找回丢失的硬盘数据:一个简单易懂的步骤指南
    当意识到硬盘或是其他存储设备丢失了重要数据时,首先要做的就是保持冷静。紧张和焦虑可能会导致误操作,进一步损坏数据。在找到好用的方法之前,可以先明确具体想要恢复哪些数据,以及这些数据位于原来的什么位置。其次,在执行硬盘数据恢复之前,还可以先检查下备份。如果平时有定期备份数据......
  • 找回丢失的硬盘数据:一个简单易懂的步骤指南
    现代社会中,数据的重要性不言而喻,我们习惯依赖电脑来存储数据,例如,工作文件、照片、视频、学习资料等。有时候,存储在硬盘上的数据会不可避免的丢失,一旦丢失了重要数据,要面对的将是不可估量的损失。本文将提供一个简单易懂的恢复指南,帮你轻松恢复丢失的硬盘数据,冷静应对数据丢失问题。......
  • 每日总结(c/s架构简单的登录模块)
    单一职责原则实例——登录模块 登录模块在实际项目开发中很常见,请按照教材28页利用单一职责原则重构后的类图实现这一模块。1、新建 javaproject 2、导入jar包mysql-connector-java-8.0.22.jar    *此处注意jar包的版本不能过低,否则数据库连接失败3、......
  • cube.js node addon 开发使用的框架neon 简单说明
    cube.jsnodeaddon的开发使用了neon框架,基于neon开发nodeaddon的好处是简单,而且开发上比较类似node的开发模式但是缺点也有不少,比如napi-rs支持方便的typescript类型定义生成,可以方便我们使用,对于neon这个issue大家已经提议很久了,应该是实现上问题比较多,官方还是没有实......
  • 如何创建docker容器简单教程与应用
    当今软件开发领域中,容器化技术已经成为了一种非常流行的解决方案。Docker容器是其中最受欢迎的一种。Docker容器是一种轻量级、可移植、自包含的软件打包技术,它可以将应用程序及其所有依赖项打包在一起,以便在任何地方运行。Docker容器可以在任何操作系统上运行,而不需要进行任何修改......
  • autotool工具的使用方式(简单的例子)
    原文:https://www.cnblogs.com/AshenYi/p/14882469.htmlautotool是一种帮助用户自动管理项目生成Makefile的工具。有时候手动写Makefile可以满足自己的要求,但是随着项目增加,代码结构也变得非常复杂,这样一来手动维护每个Makefile就变得非常困难。autotool的存在帮助降低了项目维......
  • 一个简单的QQ空间下雪效果的Java代码示例
    ​  以下是一个简单的QQ空间下雪效果的Java代码示例​编辑```javaimportjava.awt.*;importjavax.swing.*;publicclassSnowFallextendsJFrame{  privateintwidth,height;  privateintsnowCount;  privateint[]snowXPositions,snowYPositio......
  • 写个简单的管理数组指针的智能指针
    模板智能数组指针1.管理任意类型的数组指针2.释放的时候自动删除数组指针指向的内存//模板智能数组指针template<typenameT>classAiArrayPtr{public:AiArrayPtr(T*pArray){m_pAiPtr=pArray;m_bIsMyPtr=true;//是自己管理的指针......