当前位置: 首页 > news >正文

【自用】0-1背包问题与完全背包问题的Java实现

引言

背包问题是计算机科学领域的一个经典优化问题,分为多种类型,其中最常见的是0-1背包问题和完全背包问题。这两种问题的核心在于如何在有限的空间内最大化收益,但它们之间存在一些关键的区别:0-1背包问题允许每个物品只能选择一次,而完全背包问题则允许无限次选取同一物品。本篇博客将分别介绍这两个问题的动态规划解法,并附带相应的Java代码实现。

0-1背包问题

问题描述

假设你有一个背包,其最大承重能力为W千克,现在有一系列物品,每个物品有自己的重量Wi和价值Vi。你的任务是从这些物品中挑选一部分装入背包,使得背包的价值尽可能大,但不能超过背包的最大承重限制。

解决方案

我们可以采用动态规划的方法来求解这个问题。定义一个二维数组dp[i][j]表示从前i个物品中选择若干个放入容量为j的背包所能获得的最大价值。状态转移方程

Java代码实现

package dp;import java.util.ArrayList;
import java.util.List;public class Knapsack {public static void main(String[] args) {int n = 4; // 物品数量int bagweight = 16; // 背包最大容量int[] weight = {5, 7, 3, 4}; // 物品重量int[] value = {2, 5, 8, 1}; // 物品价值// 初始化 dp 数组int[][] dp = new int[n + 1][bagweight + 1];// 动态规划填充 dp 数组for (int i = 1; i <= n; i++) {for (int j = 0; j <= bagweight; j++) {if (j < weight[i - 1]) {dp[i][j] = dp[i - 1][j]; // 不选择当前物品} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); // 选择或不选择当前物品}}}// 输出最大价值System.out.println("最大价值: " + dp[n][bagweight]);// 回溯找到具体的物品List<Integer> selectedItems = new ArrayList<>();int i = n, j = bagweight;while (i > 0 && j > 0) {if (dp[i][j] != dp[i - 1][j]) {selectedItems.add(i - 1); // 物品索引从0开始j -= weight[i - 1];}i--;}// 输出选择的物品System.out.print("选择的物品: ");for (int item : selectedItems) {System.out.print(item + " (重量: " + weight[item] + ", 价值: " + value[item] + ") ");}System.out.println();}
}

完全背包问题

问题描述

完全背包问题与0-1背包问题类似,不同之处在于每个物品的数量不限,即你可以无限制地选择同一个物品。

解决方案

对于完全背包问题,我们需要稍微修改一下状态转移方程。由于每个物品都可以多次选择,因此需要在循环中考虑是否要加入该物品到背包中。

  1. 状态表示

    • dp[i][j] 表示前 i 种物品放入容量为 j 的背包里任意取的最大价值。
  2. 确定边界和遍历顺序

    • 先遍历背包重量 (内层),再遍历物品 (外层循环)。
      for(int i=1;i<=n;i++) // 物品数量for(int j=1;j<=m;j++) // 背包容量if(j>=w[i]) // 判断是否能放得下第i件物品dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); // 更新dp数组else dp[i][j]=dp[i-1][j]; // 不选第i件物品
  3. 找到状态转移方程

    • 状态转移方程是关键部分,它描述了如何从已知的状态推导出新的状态。
      dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
    • 这意味着,对于每一件物品,可以选择放进去或者不放,比较两种情况下所能获得的最大价值。

Java代码实现

package dp;import java.util.ArrayList;
import java.util.List;public class AllPack {public static void main(String[] args) {int n = 3; // 物品数量int bagweight = 7; // 背包最大容量int[] weight = {3, 4, 2}; // 物品重量int[] value = {4, 5, 3}; // 物品价值// 初始化 dp 数组int[][] dp = new int[n + 1][bagweight + 1];// 动态规划填充 dp 数组for (int i = 1; i <= n; i++) {for (int j = 0; j <= bagweight; j++) {dp[i][j] = dp[i - 1][j]; // 不选择当前物品if (j >= weight[i - 1]) {dp[i][j] = Math.max(dp[i][j], dp[i][j - weight[i - 1]] + value[i - 1]); // 选择或不选择当前物品}}}// 输出最大价值System.out.println("最大价值: " + dp[n][bagweight]);// 回溯找到具体的物品List<Integer> selectedItems = new ArrayList<>();int i = n, j = bagweight;while (i > 0 && j >= 0) {if (j >= weight[i - 1] && dp[i][j] != dp[i - 1][j]) {selectedItems.add(i - 1); // 物品索引从0开始j -= weight[i - 1];}i--;}// 输出选择的物品System.out.print("选择的物品: ");for (int item : selectedItems) {System.out.print(item + " (重量: " + weight[item] + ", 价值: " + value[item] + ") ");}System.out.println();}
}

  1. 0-1背包问题

    • 每个物品只能选择一次。
    • 回溯逻辑中,一旦确定选择了某个物品,就从当前的背包容量中减去该物品的重量,并且继续回溯下一个物品。
  2. 完全背包问题

    • 每个物品可以选择多次,直到背包容量不允许为止。
    • 回溯逻辑中,需要检查在当前背包容量下可以选择该物品的次数。这通常涉及到一个循环,直到背包容量不足以再添加一个该物品为止。

相关文章:

【自用】0-1背包问题与完全背包问题的Java实现

引言 背包问题是计算机科学领域的一个经典优化问题&#xff0c;分为多种类型&#xff0c;其中最常见的是0-1背包问题和完全背包问题。这两种问题的核心在于如何在有限的空间内最大化收益&#xff0c;但它们之间存在一些关键的区别&#xff1a;0-1背包问题允许每个物品只能选择…...

HTML5实现俄罗斯方块小游戏

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面1.3 游戏结束界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143788449 HTML5实现俄罗斯方块小游戏&#x…...

Mybatis官方生成器使用示例

在这篇文章中&#xff0c;我们将通过实际代码示例来说明如何使用 MyBatis Generator (MBG) 来自动化生成 MyBatis 项目所需的实体类、Mapper 接口和 Mapper XML 文件。我们将使用一个 Maven 插件来执行代码生成&#xff0c;并提供详细的配置和解释。 1. MyBatis Generator 简介…...

演员王子辰—专注革命题材 《前行者》后再出发

2021年10月22日在北京卫视播出的由张鲁一、聂远等人主演的电视剧《前行者》&#xff0c;讲述了在二十世纪三十年代初&#xff0c;因叛徒出卖&#xff0c;我上海地下党组织遭到严重破坏&#xff0c;革命事业陷入一片白色恐怖之中。我党情报员马天目刚从法国归来&#xff0c;临危…...

Spring Boot基础教学:创建第一个Spring Boot项目

使用Spring Initializr生成项目 Spring Initializr是一个在线工具&#xff0c;用于快速生成Spring Boot项目的基本结构。以下是使用Spring Initializr创建项目的步骤&#xff1a; 步骤1&#xff1a;访问Spring Initializr 打开网址 start.spring.io。 步骤2&#xff1a;选择…...

基于SpringBoot+Vue实现校园多媒体信息共享平台

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…...

WebRTC API分析

主题 本文详细描述常用的webrtc api 媒体协商类 myPeerConnection.createOffer([options]); var options { offerToReceiveAudio: true, // 告诉另一端&#xff0c;你是否想接收音频&#xff0c;默认true offerToReceiveVideo: true, // 告诉另一端&a…...

ArkTS学习笔记:ArkTS起步

ArkTS是HarmonyOS的主力应用开发语言&#xff0c;基于TypeScript扩展&#xff0c;强化了静态检查和分析&#xff0c;旨在提升程序稳定性和性能。它采用静态类型&#xff0c;禁止运行时改变对象布局&#xff0c;并对UI开发框架能力进行扩展&#xff0c;支持声明式UI描述和自定义…...

spring-gateway网关聚合swagger实现多个服务接口切换

前提条件 微服务已经集成了swagger&#xff0c;并且注册进了nacos。 gateway配置 package com.zmy.springcloud.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springfra…...

关于 Oracle Database Express Edition 的功能和安装

Oracle Database Express Edition&#xff0c;简称 Oracle Database XE。是一个免费的版本&#xff0c;主要用于培训和一些功能要求比较简单&#xff0c;又需要免费分发的场景。 看看官方的说明&#xff1a; Whether you are a developer, a DBA, a data scientist, an educat…...

领夹麦克风哪个品牌好,手机领夹麦克风哪个牌子好,选购推荐

​无线麦克风凭借其无与伦比的便携性与灵活性&#xff0c;成为在演讲、表演以及会议等多种场合中不可或缺的有力帮手。它挣脱了线缆的束缚&#xff0c;使得声音的传播更加自由自在。其操作十分简便&#xff0c;只需简单配对就能投入使用&#xff0c;从而可以轻松地适应各类场景…...

什么是 Go 语言?

Go 语言&#xff08;也称为 Golang&#xff09;是由 Google 开发的一种开源编程语言。它最初由 Rob Pike、Ken Thompson 和 Robert Griesemer 等人于 2007 年设计&#xff0c;经过两年的研发&#xff0c;于 2009 年首次公开发布。Go 语言的设计目标是提高编程效率&#xff0c;特…...

AI 大模型重塑软件开发流程:定义、应用、优势与挑战

随着人工智能技术的飞速发展&#xff0c;AI 大模型正在深刻影响软件开发的各个环节。从代码自动生成到智能测试&#xff0c;AI 大模型不仅提高了开发效率&#xff0c;还带来了全新的开发模式和流程变化。本文将从 AI 大模型的定义、应用场景、优势以及挑战等方面&#xff0c;探…...

微服务即时通讯系统的实现(客户端)----(1)

目录 1. 项目整体介绍1.1 项目概况1.2 界面预览和功能介绍1.3 技术重点和服务器架构 2. 项目环境搭建2.1 安装Qt62.3 安装vcpkg2.3 安装protobuf2.4 构建项目2.5 配置CMake属性 3. 项目核心数据结构的实现3.1 创建data.h存放核心的类3.2 工具函数的实现3.3 创建编译开关 4. 界面…...

【freertos】FreeRTOS时间管理

FreeRTOS时间管理 一、睡眠延时函数1、vTaskDelay2、vTaskDelayUntil3、相对延时与绝对延时对比 二、自定义延时函数1、微秒延时2、毫秒延时 一、睡眠延时函数 1、vTaskDelay \quad 在UCOSIII 中延时函数OSTimeDly()可以设置为三种模式:相对模式、周期模式和绝对模式。在FreeR…...

台式电脑没有声音怎么办?台式电脑没有声音解决详解

台式电脑一般来说都是没有内置扬声器的&#xff0c;需要连接耳机或者是音响才可以播放音乐。那么如果遇到台式电脑没有声音的问题&#xff0c;我们也需要确认这些设备硬件有没问题&#xff0c;知道原因才可以进行处理。下面本文将为你介绍台式电脑没有声音的可能原因和解决方法…...

机器学习基础02

目录 1.特征工程 1.1特征工程概念 1.2特征工程的步骤 1.3特征工程-特征提取 1.3.1字典列表(json)特征提取 1.3.2文本特征提取 英文文本提取 中文文本提取 1.3.3TF-IDF文本特征词的稀有程度特征提取 2.无量纲化 2.1归一化 2.2标准化 2.3fit、fit_transform、transfo…...

element plus的表格内容自动滚动

<el-table:data"tableData"ref"tableRef"borderstyle"width: 100%"height"150"><el-table-column prop"date" label"名称" width"250" /><el-table-column prop"name" label&…...

哈佛商业评论 | 未来商业的技术趋势:百度李彦宏谈技术如何变革商业

在《哈佛商业评论》的HBR IdeaCast节目中&#xff0c;百度联合创始人、首席执行官兼董事长李彦宏分享了他对人工智能&#xff08;AI&#xff09;和其他技术趋势的见解。这期节目讨论了百度如何将生成式AI融入业务&#xff0c;以及这些技术如何重塑我们的生活和工作方式。让我们…...

Pytorch如何将嵌套的dict类型数据加载到GPU

在PyTorch中&#xff0c;您可以使用.to(device)方法将嵌套的字典中的所有支持的Tensor对象转移到GPU。以下是一个简单的例子 import torch# 假设您已经有了一个名为device的GPU设备对象 device torch.device("cuda:0" if torch.cuda.is_available() else "cp…...

3分钟搞定Windows安卓应用:APK安装器让你的电脑秒变安卓设备!

3分钟搞定Windows安卓应用&#xff1a;APK安装器让你的电脑秒变安卓设备&#xff01; 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你知道吗&#xff1f;现在无需安装…...

K210数字识别数据集采集的两种实用方法:串口定时与按键触发,哪种更适合你的电赛项目?

K210数字识别数据集采集实战&#xff1a;串口定时与按键触发的深度对比与优化方案 在嵌入式AI与电赛项目中&#xff0c;数据采集的质量往往决定了模型识别的上限。K210作为边缘计算设备的性价比之选&#xff0c;其数据采集方案的合理性直接影响后续模型训练效果。本文将深入剖…...

不只是优化和频率:用GaussView 5.0玩转HOMO/LUMO、电子密度与反应位点预测

不只是优化和频率&#xff1a;用GaussView 5.0玩转HOMO/LUMO、电子密度与反应位点预测 在计算化学领域&#xff0c;Gaussian和GaussView的组合堪称黄金搭档。但许多研究者往往止步于基础的几何优化和频率计算&#xff0c;未能充分挖掘这套工具在反应机理研究和论文写作中的潜力…...

Google发现的神级Prompt工程新技巧:重复Prompt提升效果

Google发现的神级Prompt工程新技巧&#xff1a;重复Prompt提升效果 关键词&#xff1a;Prompt工程、提示词优化、LLM技巧、GPT技巧、AI提问技巧、Prompt Repetition、提示词工程一、最近发现一个被低估的Prompt技巧 pdf地址 https://arxiv.org/pdf/2512.14982最近在看一篇 Goog…...

PerimeterX PX3/PX2 按压验证码逆向:从初始化到WASM关键校验的完整流程剖析

1. PerimeterX按压验证码技术背景解析 第一次遇到PerimeterX的PX3/PX2按压验证码时&#xff0c;我正帮朋友调试一个电商爬虫。那会儿鼠标按下去死活过不了验证&#xff0c;控制台里全是看不懂的加密参数。这种验证码和传统图形验证码完全不同&#xff0c;它更像一个完整的安全防…...

3个StreamFX插件核心功能:如何让OBS直播画面瞬间变专业?

3个StreamFX插件核心功能&#xff1a;如何让OBS直播画面瞬间变专业&#xff1f; 【免费下载链接】obs-StreamFX StreamFX is a plugin for OBS Studio which adds many new effects, filters, sources, transitions and encoders! Be it 3D Transform, Blur, complex Masking, …...

3步搞定Windows安卓应用安装:告别模拟器的全新体验

3步搞定Windows安卓应用安装&#xff1a;告别模拟器的全新体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上运行手机应用&#xff0c;却…...

Rviz Publish Point进阶玩法:打造你的交互式机器人任务编辑器

Rviz Publish Point进阶玩法&#xff1a;打造你的交互式机器人任务编辑器 在仓储巡检、展厅导览等场景中&#xff0c;机器人需要频繁执行多目标点任务序列。传统编程方式每次修改路径都需要重新编译代码&#xff0c;而Rviz的Publish Point功能配合定制化开发&#xff0c;可以将…...

3分钟掌握:U校园智能刷课自动化终极实战指南

3分钟掌握&#xff1a;U校园智能刷课自动化终极实战指南 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 还在为重复的网课练习消耗宝贵时间而烦恼吗&#xff1f;AutoUnipus智能刷…...

终极免费Switch模拟器yuzu:解决电脑玩任天堂游戏的5大痛点

终极免费Switch模拟器yuzu&#xff1a;解决电脑玩任天堂游戏的5大痛点 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在电脑上畅玩Switch游戏却总是遇到各种问题&#xff1f;yuzu模拟器作为全球最受欢迎的开源任…...