实验五 分支限界法

实验五  分支限界法

01背包问题的分治限界法的实现

剪枝函数

限界函数

1.实验目的

1、理解分支限界法的剪枝搜索策略,掌握分支限界法的算法框架

2、设计并实现问题,掌握分支限界算法。

2.实验环境

java

3.问题描述

给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

4.复杂度

算法整体的时间复杂度主要由回溯操作的时间复杂度决定,在最坏情况下为O(2^n)。然而,在实际应用中,由于剪枝操作的存在,实际的分支数会远远小于2^n,因此算法的执行时间通常会有所缩减。

5.算法实现

package shiyan5;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;class Item {int weight;int value;double density; // 物品的单位价值(价值重量比)public Item(int weight, int value) {this.weight = weight;this.value = value;this.density = (double) value / weight;}
}public class BranchAndBound {static List<Item> items;static int capacity;static int maxTotalValue;static List<Item> selectedItems;public static void main(String[] args) {readInputData("input.txt");branchAndBound();writeOutputData("output.txt");}private static void readInputData(String filename) {try {File file = new File(filename);Scanner scanner = new Scanner(file);int n = scanner.nextInt();capacity = scanner.nextInt();items = new ArrayList<>();for (int i = 0; i < n; i++) {int weight = scanner.nextInt();int value = scanner.nextInt();items.add(new Item(weight, value));}scanner.close();} catch (IOException e) {e.printStackTrace();}}private static void branchAndBound() {Collections.sort(items, (a, b) -> Double.compare(b.density, a.density)); // 按单位价值从大到小排序maxTotalValue = 0;selectedItems = new ArrayList<>();backtrack(0, 0, 0);// 按照物品的原始顺序排序Collections.sort(selectedItems, (a, b) -> Integer.compare(items.indexOf(a), items.indexOf(b)));}private static void backtrack(int level, int currentWeight, int currentValue) {if (level == items.size() || currentWeight == capacity) {if (currentValue > maxTotalValue) {maxTotalValue = currentValue;selectedItems.clear();for (int i = 0; i < level; i++) {if (items.indexOf(items.get(i)) != -1) {selectedItems.add(items.get(i));}}}return;}if (currentWeight + items.get(level).weight <= capacity) {currentWeight += items.get(level).weight;currentValue += items.get(level).value;backtrack(level + 1, currentWeight, currentValue);currentWeight -= items.get(level).weight;currentValue -= items.get(level).value;}if (bound(level + 1, currentWeight, currentValue) > maxTotalValue) {backtrack(level + 1, currentWeight, currentValue);}}private static double bound(int level, int currentWeight, int currentValue) {double maxBound = currentValue;int currentLevel = level;int currentWeightSum = currentWeight;while (currentWeightSum < capacity && currentLevel < items.size()) {if (currentWeightSum + items.get(currentLevel).weight <= capacity) {currentWeightSum += items.get(currentLevel).weight;maxBound += items.get(currentLevel).value;} else {double remainingWeight = capacity - currentWeightSum;maxBound += (remainingWeight / items.get(currentLevel).weight) * items.get(currentLevel).value;break;}currentLevel++;}return maxBound;}private static void writeOutputData(String filename) {try {FileWriter writer = new FileWriter(filename);writer.write("背包中物品的总价值: " + maxTotalValue);writer.write("\n\n已选物品列表:\n");for (Item item : selectedItems) {writer.write("重量: " + item.weight + ", 价值: " + item.value);writer.write("\n");}writer.close();System.out.println("输出成功!");} catch (IOException e) {e.printStackTrace();}}
}

输入

 运行

输出

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

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

相关文章

Cesium态势标绘专题-位置点(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

企业微信在ios机型无法吊起打开个人信息页接口(openUserProfile)

wx.qy.openUserProfile({type: 1,//1表示该userid是企业成员&#xff0c;2表示该userid是外部联系人userid: "wmEQlEGwAAHxbWYDOK5u3Af13xlYAAAA", //可以是企业成员&#xff0c;也可以是外部联系人success: function(res) {// 回调} });遇到的问题&#xff1a;调用打…

动态规划入门第1课

1、从计数到选择 ---- 递推与DP&#xff08;动态规划&#xff09; 2、从递归到记忆 ---- 子问题与去重复运算 3、动态规划的要点 第1题 网格路1(grid1) 小x住在左下角(0,0)处&#xff0c;小y在右上角(n,n)处。小x需要通过一段网格路才能到小y家。每次&#xff0c;小x可以选…

macOS mysql 8.0 忘记密码

╰─➤ mysql -V mysql Ver 8.0.33 for macos13.3 on arm64 (Homebrew)mysql.server status mysql.server stopskip-grant-tables 启动mysql ─➤ /opt…

云计算和云架构是什么 有什么用途?

云计算是一种基于互联网的计算方式&#xff0c;它通过网络将计算资源(如计算能力、存储、网络带宽等)以服务的形式提供给用户&#xff0c;并允许用户根据需求进行灵活的资源调配和管理。云计算通常分为三个层次&#xff0c;即基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服…

MongoDB常用语句

MongoDB常用语句 使用创建和删除查询条件查询模糊查询分页排序聚合两表连接 插入 使用 展示数据库 show dbs 或 show databases 查看当前在使用的数据库 db展示数据库下所有表 show collections 或 show tables;终端内容过多&#xff0c;用该指令清屏 cls创建和删除 如果…

[SQL挖掘机] - 比较运算符

介绍: 在 sql 中&#xff0c;比较运算符用于比较表达式或值之间的关系&#xff0c;并生成逻辑真&#xff08;true&#xff09;或逻辑假&#xff08;false&#xff09;的结果。比较运算符在 sql 查询中扮演着重要的角色&#xff0c;具有以下作用和地位&#xff1a; 条件筛选&a…

【Matlab】基于径向基神经网络的数据回归预测(Excel可直接替换数据)

【Matlab】基于径向基神经网络的数据回归预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码6.完整代码7.运行结果1.模型原理 基于径向基神经网络(Radial Basis Function Neural Network,RBFNN)的数据回归预测是一种基于神经网络的回归模型…

【Matlab】基于遗传算法优化 BP 神经网络的时间序列预测(Excel可直接替换数据)

【Matlab】基于遗传算法优化 BP 神经网络的时间序列预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.文件结构3.Excel数据4.分块代码4.1 arithXover.m4.2 delta.m4.3 ga.m4.4 gabpEval.m4.5 initializega.m4.6 maxGenTerm.m4.7 nonUnifMutation.m4.8 normGeomSel…

使用Redis实现双平面部署的最佳实践

引言&#xff1a; 双平面部署是一种常见的系统架构模式&#xff0c;用于提高系统的可靠性和性能。在这种架构中&#xff0c;拥有相同功能的两个平面同时运行&#xff0c;其中一个平面作为主平面处理请求&#xff0c;而另一个平面则作为备份平面。在传统的双平面部署中&#xf…

操作系统笔记、面试八股(三)—— 系统调用与内存管理

文章目录 3. 系统调用3.1 用户态与内核态3.2 系统调用分类3.3 如何从用户态切换到内核态&#xff08;系统调用举例&#xff09; 4. 内存管理4.1 内存管理是做什么的4.1.1 为什么需要虚拟地址空间4.1.2 使用虚拟地址访问内存有什么优势 4.2 常见的内存管理机制4.3 分页管理4.3.1…

Android-WebRTC-实现摄像头显示

EglBase是什么&#xff1f; 它提供了一个接口&#xff0c;用于在Android平台上创建和管理EGL&#xff08;嵌入式系统图形库&#xff09;上下文&#xff0c;以便在WebRTC中进行图像和视频的处理和渲染。 Capturer, Source, Track, Sink分别是什么&#xff1f; Capturer&#xff…

2023C语言暑假作业day3

1 选择题 1 已知函数的原型是&#xff1a; int fun(char b[10], int a); &#xff0c;设定义&#xff1a; char c[10];int d; &#xff0c;正确的调用语句是 A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d); 答案解析&#xff1a; 正确答案&#x…

kettle开发-Day40-AI分流之case/switch

前言&#xff1a; 前面我们讲到了很多关于数据流的AI方面的介绍&#xff0c;包括自定义组件和算力提升这块的&#xff0c;今天我们来学习一个关于kettle数据分流处理非常重要的组件Switch / Case 。当我们的数据来源于类似日志、csv文件等半结构化数据时&#xff0c;我们需要在…

Vmware+CentOS+KGDB内核双机调试

1.准备两台CentOS系统的vmware虚拟机 其中一台作为调试机&#xff0c;另一台则作为被调试机。如下图&#xff0c;CentOS7.9x64为被调试机&#xff0c;CentOS7.9x64-Debugger为调试机 2.配置串口设备 若虚拟机有串口设备&#xff08;如打印机&#xff09;&#xff0c;需要先删…

黑马 pink h5+css3+移动端前端

网页概念 网页是网站的一页,网页有很多元素组成,包括视频图片文字视频链接等等,以.htm和.html后缀结尾,俗称html文件 HTML 超文本标记语言,描述网页语言,不是编程语言,是标记语言,有标签组成 超文本指的是不光文本,还有图片视频等等标签 常用浏览器 firefox google safari…

MFC 编辑框输入16进制字符串转换为16进制数或者10进制数据计算

1. 编辑框添加变量&#xff0c;并选择变量类型为CString。 CString m_strReg; DDX_Text(pDX, IDC_EDIT_REG, m_strReg); 2. 使用“strtoul”或“_tcstoul”函数将Cstring 类型转换为16进制/10进制数进行计算。 CString tmp; UpdateData(TRUE); UpdateData(FALSE); …

【KD】知识蒸馏与迁移学习的不同

知识蒸馏与迁移学习的不同 (1)数据域不同. 知识蒸馏中的知识通常是在同一个目标数据集上进行迁移&#xff0c;而迁移学习中的知识往往是在不同目标的数据集上进行转移. (2)网络结构不同. 知识蒸馏的两个网络可以是同构或者异构的&#xff0c;而迁移学习通常是在单个网络上利用其…

anaconda简单使用

anaconda 是一个环境管理工具&#xff0c;各个环境的安装包互不影响 下载 https://www.anaconda.com/ 配置 更换清华下载源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsin…

LabVIEW基础-lvlib库

文章目录 lvlib库llb库lvlib与llb的区别lvlib常见错误断开vi与库之间的连接 lvlib库 文件-新建-库&#xff0c;创建一个项目库文件。能在项目中创建的文件类型&#xff0c;都可以在库中创建。 在lvlib上右键-添加-文件&#xff0c;将被选中的文件放到lvlib中。被添加进lvlib的…