Java手写背包问题算法应用拓展案例

Java手写背包问题算法应用拓展案例

1. 0-1背包问题

实际案例:购物问题

假设你是一个购物爱好者,你去商场购物,商场里有很多商品,每个商品有自己的重量和价值。你只有一个背包,它的容量是有限的。你希望在购物过程中选择一些商品放入背包中,使得背包中的商品总价值最大。

public class KnapsackProblem {public static void main(String[] args) {int[] weights = {2, 3, 4, 5}; // 商品的重量int[] values = {3, 4, 5, 6}; // 商品的价值int capacity = 8; // 背包的容量int maxValue = knapsack01(weights, values, capacity);System.out.println("最大总价值为:" + maxValue);}// 定义函数,求解0-1背包问题public static int knapsack01(int[] weights, int[] values, int capacity) {int n = weights.length;int[][] dp = new int[n+1][capacity+1];for (int i = 1; i <= n; i++) {for (int j = 1; j <= capacity; j++) {if (weights[i-1] <= j) {dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weights[i-1]] + values[i-1]);} else {dp[i][j] = dp[i-1][j];}}}return dp[n][capacity];}
}

输出结果为:

最大总价值为:9

根据以上代码,我们可以得到购物问题的最优解,选择重量为2和3的商品,总价值为9。

2. 完全背包问题

实际案例:旅行问题

假设你是一个旅行爱好者,你计划去旅行,旅行地有很多景点,每个景点有自己的重量和价值。你只有一个背包,它的容量是有限的。你希望在旅行过程中选择一些景点参观,使得背包中的景点总价值最大。

public class KnapsackProblem {public static void main(String[] args) {int[] weights = {2, 3, 4, 5}; // 景点的重量int[] values = {3, 4, 5, 6}; // 景点的价值int capacity = 8; // 背包的容量int maxValue = knapsackComplete(weights, values, capacity);System.out.println("最大总价值为:" + maxValue);}// 定义函数,求解完全背包问题public static int knapsackComplete(int[] weights, int[] values, int capacity) {int n = weights.length;int[] dp = new int[capacity+1];for (int i = 0; i < n; i++) {for (int j = weights[i]; j <= capacity; j++) {dp[j] = Math.max(dp[j], dp[j-weights[i]] + values[i]);}}return dp[capacity];}
}

输出结果为:

最大总价值为:12

根据以上代码,我们可以得到旅行问题的最优解,选择重量为2和3的景点,总价值为12。

3. 多重背包问题

实际案例:装箱问题

假设你是一个货物装箱员,你需要将一批货物装箱,每个货物有自己的重量和价值,而且每个货物的数量是有限的。你只有一个箱子,它的容量是有限的。你希望在装箱过程中选择一些货物放入箱子中,使得箱子中的货物总价值最大。

public class KnapsackProblem {public static void main(String[] args) {int[] weights = {2, 3, 4, 5}; // 货物的重量int[] values = {3, 4, 5, 6}; // 货物的价值int[] counts = {1, 2, 3, 4}; // 货物的数量int capacity = 8; // 箱子的容量int maxValue = knapsackMultiple(weights, values, counts, capacity);System.out.println("最大总价值为:" + maxValue);}// 定义函数,求解多重背包问题public static int knapsackMultiple(int[] weights, int[] values, int[] counts, int capacity) {int n = weights.length;int[] dp = new int[capacity+1];for (int i = 0; i < n; i++) {for (int j = capacity; j >= weights[i]; j--) {for (int k = 1; k <= counts[i] && k*weights[i] <= j; k++) {dp[j] = Math.max(dp[j], dp[j-k*weights[i]] + k*values[i]);}}}return dp[capacity];}
}

输出结果为:

最大总价值为:22

根据以上代码,我们可以得到装箱问题的最优解,选择重量为2、3和5的货物,总价值为22。

以上就是Java手写背包问题算法应用拓展案例的完整代码和实际案例。通过这些案例,我们可以更好地理解和应用背包问题算法。

商品选择问题

在电商平台的商品推荐系统中,根据用户的购买历史和偏好,需要选出一组适合的商品推荐给用户。这可以视为一个背包问题的应用。下面是使用Java手写背包问题算法解决商品选择问题的完整代码。

  1. 定义商品类(Item):
class Item {String name;int value;int weight;public Item(String name, int value, int weight) {this.name = name;this.value = value;this.weight = weight;}
}
  1. 实现背包问题算法(Knapsack):
import java.util.ArrayList;
import java.util.List;class Knapsack {List<Item> selectItems(Item[] items, int maxWeight) {int n = items.length;int[][] dp = new int[n + 1][maxWeight + 1];for (int i = 1; i <= n; i++) {for (int j = 1; j <= maxWeight; j++) {if (items[i - 1].weight <= j) {dp[i][j] = Math.max(dp[i - 1][j], items[i - 1].value + dp[i - 1][j - items[i - 1].weight]);} else {dp[i][j] = dp[i - 1][j];}}}List<Item> selectedItems = new ArrayList<>();int i = n, j = maxWeight;while (i > 0 && j > 0) {if (dp[i][j] != dp[i - 1][j]) {selectedItems.add(items[i - 1]);j -= items[i - 1].weight;}i--;}return selectedItems;}
}
  1. 测试代码:
public class Main {public static void main(String[] args) {Item item1 = new Item("商品1", 10, 4);Item item2 = new Item("商品2", 8, 3);Item item3 = new Item("商品3", 6, 2);Item item4 = new Item("商品4", 4, 1);Item[] items = {item1, item2, item3, item4};int maxWeight = 5;Knapsack knapsack = new Knapsack();List<Item> selectedItems = knapsack.selectItems(items, maxWeight);System.out.println("选择的商品:");for (Item item : selectedItems) {System.out.println(item.name);}}
}

工程任务调度问题

在一个工程项目中,有多个任务需要执行,这些任务存在依赖关系,即某些任务必须在其他任务完成之后才能开始。通过背包问题算法可以解决工程任务调度问题。下面是使用Java手写背包问题算法解决工程任务调度问题的完整代码。

  1. 定义任务类(Task):
class Task {String name;int duration;List<Task> dependencies;public Task(String name, int duration, List<Task> dependencies) {this.name = name;this.duration = duration;this.dependencies = dependencies;}
}
  1. 实现背包问题算法(TaskScheduler):
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;class TaskScheduler {Set<Task> selectedTasks = new HashSet<>();void scheduleTasks(List<Task> tasks) {for (Task task : tasks) {if (!selectedTasks.contains(task)) {selectTask(task);}}}void selectTask(Task task) {for (Task dependency : task.dependencies) {if (!selectedTasks.contains(dependency)) {selectTask(dependency);}}selectedTasks.add(task);System.out.println("执行任务:" + task.name);}
}

算法应用总结

当涉及到手写背包问题算法的应用和拓展案例时,以下是一个总结:

  1. 0/1背包问题:每个物品要么被选中放入背包中,要么不放入。

    • 算法思路:使用动态规划算法,创建一个二维数组dp[i][j],其中dp[i][j]表示将前i个物品放入容量为j的背包时的最大价值。
    • 算法步骤:
      • 初始化dp数组为0。
      • 对于每个物品i,在容量为j的背包内进行判断:
        • 如果当前物品的重量wi大于背包容量j,则dp[i][j]等于dp[i-1][j],即不放入该物品。
        • 否则,比较放入该物品的价值(dp[i-1][j-wi]加上当前物品价值)与不放入该物品的价值(dp[i-1][j])的大小,取较大的值作为dp[i][j]的值。
      • 最终dp数组的最后一个元素dp[n][W]即为背包容量为W时的最大价值。
  2. 完全背包问题:每个物品可以无限次地放入背包中。

    • 算法思路:同样使用动态规划算法,但是需要对物品的放入次数进行遍历判断。
    • 算法步骤:
      • 初始化dp数组为0。
      • 对于每个物品i,在容量为j的背包内进行判断:
        • 遍历放入该物品的次数k,从0到j/wi,其中wi为物品的重量:
          • 假设当前放入k个物品i,则背包的容量减少为j-kwi,价值增加为dp[i-1][j-kwi]加上k*vi,其中vi为物品的价值。
          • 比较该情况下的价值与不放入该物品的价值dp[i-1][j]的大小,取较大值作为dp[i][j]的值。
      • 最终dp数组的最后一个元素dp[n][W]即为背包容量为W时的最大价值。

这些是背包问题的基本算法总结和应用案例,通过调整问题的约束条件和算法思路,还可以进行更多的扩展,如多重背包问题、分数背包问题等。

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

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

相关文章

恒合仓库 - 仓库管理系统搭建

仓库管理系统搭建 文章目录 仓库管理系统搭建一、项目介绍1.1 项目描述1.2 技术选型1.3 模块划分 二、搭建前端环境三、搭建后端环境3.1 创建springboot项目 - 划分包层次3.2 导入依赖3.3 启动类配置3.4.配置文件配置 一、项目介绍 1.1 项目描述 项目搭球为满足日益扩大的仓库…

Matlab图像处理-区域描述

一旦一幅图像的目标区域被确定&#xff0c;我们往往用一套描述子来表示其特性。选择区域描述子的动机不单纯为了减少在区域中原始数据的数量&#xff0c;而且也应有利于区别带有不同特性的区域。因此&#xff0c;当目标区域有大小、旋转、平移等方面的变化时&#xff0c;针对这…

2023 亲测好用版VScode配置文件

tasks.json {"tasks": [{"type": "cppbuild","label": "g++",// 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc 和launch中preLaunchTask保持一致// "command": "D:/Users/Downloads/ming…

力扣 -- 394. 字符串解码

解题方法&#xff1a; 参考代码&#xff1a; class Solution{ public:string decodeString(string s){stack<string> sst;stack<int> dst;//防止字符串栈为空的时候再追加字符串到栈顶元素sst.push("");int n s.size();int i 0;while(i<n)//最好不…

高级运维学习(九)块存储、文件系统存储和对象存储的实现

块存储基础 块设备存取数据时&#xff0c;可以一次存取很多。字符设备只能是字符流 [rootceph1 ~]# ll /dev/sda brw-rw---- 1 root disk 8, 0 Dec 12 13:15 /dev/sda # b表示block&#xff0c;块设备[rootceph1 ~]# ll /dev/tty crw-rw-rw- 1 root tty 5, 0 Dec 12 13:31 /d…

工业机器人仿真参考

最近有一些朋友看到我做的关于Unity3d仿真机器人的项目&#xff0c;本次我在平台做以分享&#xff0c;希望的朋友或者有需要在此基础做开发的可以参考下。 开发工具&#xff1a; 下位机&#xff1a;Unity3D 上位机&#xff1a;Visual Studio 机械臂模型&#xff1a;TH6-QKM…

从零开始:使用Python创建GUI驱动的简易国际象棋游戏

第一部分&#xff1a;国际象棋的基础 1. 介绍 国际象棋&#xff0c;一个古老而又充满策略的游戏&#xff0c;历经数世纪的发展&#xff0c;至今仍然广受喜爱。那么&#xff0c;如何使用Python来创建一个简单的国际象棋游戏&#xff0c;并给它加上一个图形界面(GUI)呢? 这篇文…

Python图像处理初探:Pillow库的基础使用

图像处理在许多领域都有广泛的应用&#xff0c;包括计算机视觉&#xff0c;机器学习&#xff0c;人工智能&#xff0c;网页开发等。Pillow库是Python中最流行的图像处理库之一&#xff0c;它是PIL&#xff08;Python Imaging Library&#xff09;的一个分支&#xff0c;提供了丰…

高云FPGA系列教程(7):ARM GPIO外部中断

文章目录 [toc]GPIO中断简介FPGA配置常用函数MCU程序设计工程下载 本文是高云FPGA系列教程的第7篇文章。 本篇文章介绍片上ARM Cortex-M3硬核处理器GPIO外部的使用&#xff0c;演示按键中断方式来控制LED亮灭&#xff0c;基于TangNano 4K开发板。 参考文档&#xff1a;Gowin_E…

Android 下的usb框架及功能点

有关USB android框架的链接 http://blog.sina.com.cn/s/articlelist_1627432177_0_1.html ICS4.0下Framework层的usb框架 Android 下的usb主要工作还是在android的framework层。主要有以下几个文件&#xff1a; 1.1UsbDeviceManager.java/高 主要完成功能切换及状态的更新&a…

L1-027 出租

一、题目再现 下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#xff0c;index[1]0 对应 arr[0]8&#xff0c;index[2]3 对应…

消息队列(五):虚拟主机设计

虚拟主机存在的意义 一个虚拟主机类似于 MySQL 的 database&#xff0c;把交换机&#xff0c;队列&#xff0c;绑定&#xff0c;消息....进⾏逻辑上的隔离&#xff0c;⼀个服务器可以有多 个虚拟主机&#xff0c;此处我们项⽬就设计了⼀个虚拟主机&#xff08;VirtualHost&…

一步一步详细介绍如何使用 Mediapipe 创建 Snapchat/Instagram 的过滤器--提供完整的实现源码

介绍 既然 Snapchat 和 Instagram 提供的滤镜可以让你在几秒钟内随心所欲地看起来狂野、异国情调或美丽,为什么还要投资化妆品或时尚服装和眼镜呢? 也许您只想闲逛并变成女巫或圣诞老人,或者也许只是通过在脸上添加滤镜来变成您最喜欢的虚构人物。有数百个这样的过滤器,…

GO-日志分析

GO-日志分析 log包简介 Go提供了logger包来做日志记录。使用方式如下所示 package mainimport ("log""os" )func main() {// 创建一个新的日志文件.默认是stdOutfile, err : os.Create("app.log")if err ! nil {log.Fatal(err)}defer file.Cl…

源码编译Qt 5.15.9+msvc2019

官方文档里给出了详细步骤&#xff1a; Building Qt Sources Building Qt 5 from Git (Wiki) 注&#xff1a;本文基于windows11vs2019x64qt5.15.9&#xff0c;不编译Qt WebEngine 归纳总结如下&#xff1a; 准备阶段 Qt for Windows - Requirements 安装python&#xff0c;…

[npm]package.json文件

[npm]package.json文件 生成 package.jsonpackage.json 必须属性nameversion 描述信息descriptionkeywordsauthorcontributorshomepagerepositorybugs 依赖配置dependenciesdevDependenciespeerDependenciesoptionalDependenciesbundledDependenciesengines 脚本配置scriptscon…

无涯教程-JavaScript - PI函数

描述 PI函数返回数字3.14159265358979,数学常数pi,精确到15位数字。 语法 PI ()争论 PI函数语法没有参数。 适用性 Excel 2007,Excel 2010,Excel 2013,Excel 2016 Example JavaScript 中的 PI函数 - 无涯教程网无涯教程网提供描述PI函数返回数字3.14159265358979,数学常…

半导体划片机工艺应用

半导体划片工艺是半导体制造过程中的重要步骤之一&#xff0c;主要用于将大尺寸的晶圆切割成小片&#xff0c;以便进行后续的制造和封装过程。以下是一些半导体划片工艺的应用&#xff1a; 晶圆划片&#xff1a;在半导体制造过程中&#xff0c;需要将大尺寸的晶圆切割成小片&am…

走进Oracle世界

1. 走进Oracle世界 1.1. Oracle简介 Oracle Database&#xff0c;又名Oracle RDBMS&#xff0c;或简称Oracle&#xff0c;为甲骨文&#xff08;Oracle&#xff09;公司的一款关系数据库管理系统&#xff0c;也是甲骨文公司起家和后续的拳头产品。在传统数据库领域&#xff0c…

webpack依赖包是同一个仓库,也要进行安装

今天项目启动不起来,已经安装好了需求,但是还是不行 后面发现是子目录的部分也需要执行一次pnpm i 执行成功,报错的红线消失了 chatGPT回答: 是的&#xff0c;当你使用 webpack 构建项目时&#xff0c;即使某些依赖包来自同一个仓库&#xff0c;也需要分别进行安装。 这是…