【算法设计】实验四回溯算法(附源代码)

这里写目录标题

  • 一、上机目的
  • 二、上机内容与要求
  • 三、上机步骤
  • 四、上机结果
    • 1、将课本5.2节算法改为程序,并输入数据及进行测试;
    • 2、自学5.4节,并完成符号三角形问题。

一、上机目的

1、通过回溯法的示例程序理解回溯法的基本思想;
2、运用回溯法解决实际问题进一步加深对回溯法的理解和运用;

二、上机内容与要求

1、分析并掌握“装载问题” 的回溯法求解方法;
2、练习使用回溯法求解“符号三角形问题”

三、上机步骤

1.理解回溯算法思想和算法示例;
2.上机输入和调试算法示例程序;
3.理解实验题的问题要求;
4.上机输入和调试自己所编的实验题程序;
5.验证并分析实验题的实验结果;
6.整理出实验报告;

四、上机结果

1、将课本5.2节算法改为程序,并输入数据及进行测试;

import java.util.Scanner;
public class MaxLoading {static final int NUM = 100;// 集装箱重量static int[] w=new int[NUM];// 最优解static int[] bestX = new int[NUM];// 当前解static int[] x= new int[NUM];// 最优装船重量static int bestW = 0;// 物品个数static int n;// 第一个船的载重量static int c1;// 第二个船的载重量static int c2;// 当前已装船重量static int cw = 0;private static int bound(int t) {// 初始化剩余重量int rw = 0;for (int i = t+1;i <= n;++i) {// 计算剩余集装箱重量rw += w[i];}// 返回可装的总重量return rw+cw;}/*** 回溯法* @param t :第几个集装箱*/public static void loadingRec(int t) {if (t > n) { // 集装箱装箱完毕if (cw > bestW) {  // 如果当前重量大于最优重量// 更新最优重量bestW = cw;for (int i = 1; i <= n; i++) {// 最优解更新为当前解bestX[i] = x[i];}}return;}else { // 尚未结束装箱if (cw + w[t] <= c1) { // 若装入当前集装箱,且重量小于船载重量// 加上此集装箱重量cw +=w[t];// 选择该集装箱x[t] = 1;// 下一个loadingRec(t+1);cw -= w[t];x[t] = 0;}if (bound(t) > bestW) { // 不装第t个集装箱,若总重量大于最优重量loadingRec(t+1);}}}public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.print("请输入集装箱的个数:");n = in.nextInt();System.out.println("请输入集装箱的重量(整数):");for (int i = 1; i <= n;++i) {w[i] = in.nextInt();}in.nextLine();System.out.print("请输入第一船的载重量:");c1 = in.nextInt();in.nextLine();System.out.print("请输入第二船的载重量:");c2 = in.nextInt();loadingRec(1);System.out.println("第一船的最优重量为:" + bestW);System.out.println("第一船的最优解为:");for (int i = 1; i <= n;++i) {if (bestX[i] == 1) { // bestX[i] == 1,表示选中System.out.println("物品" + i + "装入第1个集装箱");}}int cw2 = 0;for (int i = 1;i <= n;++i) {// 计算剩余重量if (bestX[i] == 0) {cw2 += w[i];}}// 剩余重量小于第二个船的载重量,可以装入// 下行为小于第二艘船的载重量if (cw2 <= c2) {System.out.println("可以将剩余集装箱装入第二船,问题有解");}else { // 剩余重量大于第二个船的重量,不能装入System.out.println("不能将剩余集装箱装入第二船,问题无解");}in.close();}
}

在这里插入图片描述
在这里插入图片描述

2、自学5.4节,并完成符号三角形问题。

import java.util.Scanner;/*** 符号三角形问题* @author Jaick**/
public class Triangles {public int n;//第一行的符号个数public int half;//n*(n+1)/4public int count;//当前+的个数public int[][] p;//符号三角形矩阵public long sum;//已找到的符号三角形个数public long compute(int nn){n=nn;count=0;sum=0;half=n*(n+1)/2;if(half%2==1) return 0;half=half/2;p=new int[n+1][n+1];backtrack(1);return sum;}public void backtrack(int t){if(count>half||(t*(t-1)/2-count)>half)return ;if(t>n)sum++;else{for(int i=0;i<2;i++){p[1][t]=i;count+=i;for(int j=2;j<=t;j++){p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2];//^:按位异或。比如二进制     1001 ^ 1100 = 0101  0^0=0,1^1=0 ,1^0 = 1,0^1=1。count+=p[j][t-j+1];}backtrack(t+1);for(int j=2;j<=t;j++){count-=p[j][t-j+1];}count-=i;}}}public static void main(String[] args) {Scanner in =new Scanner(System.in);Triangles t=new Triangles();System.out.println("Input:");int n=in.nextInt();long sum=t.compute(n);System.out.println("Output:");System.out.println("n="+t.n+"时,有"+sum+"个符号三角形");}
}

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信号处理-探索相邻数据点之间的变化和关联性的操作方法

当前值减去前一个值&#xff0c;乘上当前值与前一个值差值的绝对值 当前值减去后一个值&#xff0c;乘上当前值与后一个值差值的绝对值。 意义何在&#xff1f; 当前值减去前一个值&#xff1a;表示当前数据点与前一个数据点之间的变化量。当前值与前一个值差值的绝对值&…

Pycharm的Project Structure (项目结构)

文章目录 一、Sources二、Tests三、Exeluded四、Namespace packages五、Templates六、Resources 一、Sources 源代码根目录&#xff1a;包含项目的主要源代码&#xff0c;它会在这个目录下搜索代码&#xff0c;然后自动补全和只能提示都通过这里的代码提供。若项目运行自定义代…

luatos框架中LVGL如何使用中文字体〈二〉编写脚本设置中文字体

本节内容&#xff0c;将和大家一同学习&#xff0c;在luatos环境中&#xff0c;使用lvgl库&#xff0c;一步步的编译固件、编写脚本&#xff0c;最终实现中文字体的显示。 芯片&#xff1a;AIR101 LCD屏&#xff1a;ST7789 上一节&#xff0c;我们一同学习了&#xff0c;硬件引…

使用vue动态在列表中添加或者删除某一行

** 使用vue动态在列表中添加或者删除某一行 ** 先看一下展示的效果&#xff1a; 好了上代码&#xff1a; 样式界面&#xff1a; <template><div class"container"><h4 style"margin-left: 20px;">线路停靠站站点</h4><el-b…

无缝集成 MongoDB Relational Migrator,Tapdata 提供关系型到 MongoDB 实时迁移优化方案

在去年的 MongoDB 用户大会纽约站上&#xff0c;MongoDB 正式宣布全面推出新工具 MongoDB Relational Migrator&#xff08;MongoDB RM&#xff09;&#xff0c;用以简化应用程序迁移和转换——即从传统关系型数据模型到现代的文档数据模型&#xff0c;助力组织快速提升运营效率…

数字图像处理 使用C#进行图像处理九 实现傅里叶变换

一、简述 傅立叶变换将图像分解为其正弦和余弦分量。换句话说,它将图像从空间域变换到频率域。这个想法是任何函数都可以用无限正弦函数和余弦函数之和来精确近似。傅里叶变换是实现此目的的一种方法。 网上有很多关于傅里叶变换的文章,这里就不进行赘述了,这里主要结合代码…

java中xml概述

1.xml 1.1概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为…

element ui 中文离线文档(百度云盘下载)

一般内网开发上不了网&#xff0c;用离线版本比较方便&#xff0c;下载地址&#xff1a; https://download.csdn.net/download/li836779537/88355878?spm1001.2014.3001.5503 下载后里面有个 index.hrml 双击打开就可以用 效果如下&#xff1a;

Python程序设计基础——代码习题

1 __name__属性 import demodef main():if __name__ __main__:print(这个程序被直接运行。)elif __name__demo:print(这个程序作为模块被使用。) main()3.3 编写程序&#xff0c;生成包含1000个0~100之间的随机整数&#xff0c;并统计每个元素出现的次数。 import randomx[r…

助贷系统crm:帮助助贷机构实现高效的客户关系管理

助贷系统CRM&#xff08;客户关系管理系统&#xff09;是一种能够帮助助贷企业实现高效客户关系管理的工具&#xff0c;通过助贷系统CRM&#xff0c;助贷企业可以更好地管理企业客户信息&#xff0c;跟踪客户互动、提高客户满意度&#xff0c;从而促进业务增长。 1. 客户信息集…

vMware WorkStation创建虚拟机安装CentOS7,NAT模式配置网络

一、安装虚拟机 1、选择典型&#xff08;推荐&#xff09;配置 2、选择稍后安装操作系统 3、操作系统选择CentOS7 64位 4、虚拟机命名、选择安装位置 6、指定磁盘容量 7、指定磁盘容量 步骤&#xff1a; &#xff08;1&#xff09;、系统内存2GB &#xff08;2&#xff09;、…

linux-MDK can电机带导轨

确保接线正确&#xff0c;这个带导轨的电机需要24V的电压 $ ls /dev //查看端口是什么$ sudo slcand -o -s6 /dev/ttyACM0 can0 //将端口封装为can0 $ sudo ip link set can0 up //打开端口 按照电机说明书&#xff0c;按照需要的指令计算检验和&#xf…

FreeRTOS 的任务挂起和恢复

1. 任务挂起和恢复的 API 函数 API函数描述vTaskSuspend()挂起任务vTaskResume()恢复被挂起的任务xTaskResumeFromISR()在中断中恢复被挂起的任务 挂起&#xff1a;挂起任务类似暂停&#xff0c;可恢复&#xff1b; 删除任务&#xff0c;堆栈都给释放掉了&#xff0c;无法恢复…

计算机网络-第7章 网络安全(2)

7.5 密钥分配 7.6 互联网使用的安全协议 7.7 系统安全&#xff1a;防火墙与入侵检测

【故障电弧探测器 方案介绍】安科瑞电气火灾监控系统

什么是电弧&#xff1f; 电弧俗称‘电火花’ &#xff0c;又叫‘打火’ &#xff0c;本质是一种绝缘体被电压击穿后&#xff0c;由不导电变的导电&#xff0c;且发光发热的自然现象。 什么是故障电弧&#xff1f; 由于电气线路或设备中绝缘老化破损、电气连接松动、空气潮湿…

SpringCloud Hystrix 断路器

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第五篇&#xff0c;即介绍 Hystrix 断路器。 二、概述 2.1 分布式系统面临的问题 复杂分布式体系结构中…

TIOBE 3月编程排行榜出炉:遥遥领先,霸榜第一!

哈喽呀~又到了每个月的语言排行榜啦&#xff01; TIOBE 3月编程语言也已经公布&#xff0c;具体有啥新变化呢&#xff1f;快和我一起往下看~ Python遥遥领先&#xff0c;霸榜第一 先来看看本月排行榜top5的表现。毫无疑问&#xff0c;Python依然遥遥领先&#xff1a; Python 第…

RabbitMQ学习笔记——消息转化器

消息转化器的问题&#xff0c;如果我们发送方发送的数据为引用类型的对象&#xff0c;默认使用的是JDK内部自带的ObjectOutputStream进行对象序列化和反序列化&#xff0c;这样做比较复杂并且不安全。 我们可以引入Jackson来做对象的序列化&#xff0c;可将默认的JDK消息转化器…

Testng认识与配置-全网最简单

总结&#xff1a;testng支持注解&#xff0c;线程池&#xff0c;数据驱动&#xff0c;参数化&#xff0c;强大执行模式&#xff0c;也支持单元测试&#xff0c;功能测试&#xff0c;接口测试 TestNG is a testing framework inspired from JUnit and NUnit but introducing som…

Samtec前沿 | 信号发生器 - 决定可靠性的重要因素之一

【摘要/前言】 作为消费者&#xff0c;我们已经开始期待我们的技术达到一个前所未有的可靠性水平。无论是智能手机还是家庭汽车&#xff0c;我们已经开始期待智能电子设备在每次使用时都能在第一时间发挥作用。 【信号和电源发生器至关重要】 现代设备能够提供如此出色的…