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

news/2024/7/24 8:47:15 标签: 算法, java

这里写目录标题

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

一、上机目的

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

二、上机内容与要求

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

三、上机步骤

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

四、上机结果

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

java">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节,并完成符号三角形问题。

java">import java.util.Scanner;

/**
 * 符号三角形问题
 * @author Jaick
 *
 */
public class Triangles {
    public int n;//第一行的符号个数
    public int half;//n*(n+1)/4
    public 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.niftyadmin.cn/n/5425529.html

相关文章

动手做一个最小RAG——TinyRAG

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 大家好&#xff0c;我是不要葱姜蒜。 接下来我会带领大家一步一步地实现一个简单的RAG模型&#xff0c;这个模型是基于RAG的一个简化版本&#xff0c;我们称之为Tiny-RAG。Tiny-RAG是一个基于RAG的简化版本&am…

openssl3.2 - exp - PEM <==> DER

文章目录 openssl3.2 - exp - PEM <> DER概述笔记加密用的私钥(带口令保护) - PEM > DER加密用的私钥(不带口令保护) - DER > PEM将不带口令的PEM转成带口令的PEM支持口令的算法备注END openssl3.2 - exp - PEM <> DER 概述 想将客户端私钥 服务端公钥 数…

力扣hot100题解(python版69-73题)

69、有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应…

2024.3.12 C++

1、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height) 定义公有成员函数初始化函数:void init(int w, int h)更改宽度的函数:set w(int w)更改高度的函数:set h(int h)输出该矩形的周长和面积函数:void show() #include <iostream>using nam…

【黑马程序员】python函数

文章目录 函数什么是函数为什么学习函数函数定义函数的传入参数函数的返回值返回值基础None返回值 函数说明文档函数的嵌套调用定义代码示例 全局变量和局部变量全局变量global变量局部变量 函数综合案例 函数 什么是函数 组织好的&#xff0c;可重复使用的、用来实现特定功能…

使用采购管理软件构建更高效的采购模式

采购流程是企业整个采购部门的关键要素。无论企业规模大小&#xff0c;构建采购流程的模式都将直接影响企业控制成本、管理风险和保持流程弹性的能力。 下面我们将解释采购模式的类型、优缺点&#xff0c;以及如何确定哪种模式最适合你的采购部门。 集中采购的优缺点 在集中采…

【计算机网络实践】FileZilla Server1.8.1实现局域网ftp文件传输

大二新生随便写写笔记&#xff0c;轻喷&#xff0c;鉴于本人在网络搜索中并未搜索到1.8.1版本的使用方法&#xff0c;因而瞎写一页。 一、准备 下载一个FileZilla Server1.8.1在你想作为服务器的主机上&#xff08;此处直接在官网下载即可&#xff1a;Download FileZilla Serve…

如何使用vue定义组件之——子组件调用父组件数据

1.定义父子模板template <div class"container"><my-father></my-father><my-father></my-father><my-father></my-father><!-- 此处无法调用子组件&#xff0c;子组件必须依赖于父组件进行展示 --><!-- <my-…