动态规划:0/1背包问题

01背包问题是一个经典的动态规划问题,它询问在给定的物品和背包容量下,如何选择物品使得背包中的物品总价值最大,同时保证不超过背包的容量限制。物品不能分割,每个物品只能选择放入或不放入背包。

问题定义

  • 输入:

    • 物品个数 ( n )
    • 背包容量 ( W )
    • 每个物品的重量 ( w[i] )
    • 每个物品的价值 ( v[i] )
  • 输出:

    • 背包所能装载的最大价值

动态规划解法思路

  1. 定义状态:

    • 定义 ( dp[i][j] ) 为从前 ( i ) 个物品中选择,总重量不超过 ( j ) 时的最大价值。
  2. 状态转移方程:

    • 如果不选择第 ( i ) 个物品,则 ( dp[i][j] = dp[i-1][j] )。
    • 如果选择第 ( i ) 个物品(前提是 ( j \geq w[i] )),则 ( dp[i][j] = dp[i-1][j-w[i]] + v[i] )。
    • 综合考虑上述两种情况,有:
      [
      dp[i][j] = \max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]) \quad \text{if } j \geq w[i]
      ]
    • 如果 ( j < w[i] ),则只能选择不拿 ( i ) 物品的情况:( dp[i][j] = dp[i-1][j] )。
  3. 初始化条件:

    • ( dp[0][j] ) 为 0,因为没有物品时,最大价值为 0。
    • ( dp[i][0] ) 也为 0,因为容量为 0 时,不能装任何物品。
  4. 计算顺序:

    • 从 ( i = 1 ) 到 ( n ) 和 ( j = 1 ) 到 ( W )。
  5. 最终结果:

    • ( dp[n][W] ) 存储的是最大价值。

Java代码实现

下面是使用动态规划解决01背包问题的Java代码示例:

public class Knapsack {public static int knapsack(int W, int n, int[] w, int[] v) {int[][] dp = new int[n+1][W+1];// 初始化dp数组for (int i = 0; i <= n; i++) {dp[i][0] = 0;}for (int j = 0; j <= W; j++) {dp[0][j] = 0;}// 动态规划填表for (int i = 1; i <= n; i++) {for (int j = 1; j <= W; j++) {if (j >= w[i-1]) {dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1]);} else {dp[i][j] = dp[i-1][j];}}}// 返回最大价值return dp[n][W];}public static void main(String[] args) {int[] weights = {2, 3, 4, 5};int[] values = {3, 4, 5, 6};int capacity = 8;int maxProfit = knapsack(capacity, weights.length, weights, values);System.out.println("The maximum profit is " + maxProfit);}
}

在这段代码中,我们使用了一个二维数组 dp 来存储每一步的结果,并通过逐步计算填充这个表格,最终在 dp[n][W] 中得到背包能够装载

的最大价值。

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

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

相关文章

基于FPGA的数字信号处理(4)--浮点数的定点化

写在前面 首先要说明的是&#xff0c;题目《浮点数的定点化》中所谓的 浮点数 并不是指 IEEE754 规定的 单精度浮点数 或者 双精度浮点数 等格式&#xff0c;而是指10进制小数。所以说白了&#xff0c;这篇文章要讲的就是如何将10进制小数采用定点数的形式表示。 为什么2进制无…

Python新手入门基础英文笔记

1、字符串的操作 user&#xff1a;用户 name&#xff1a;名称/姓名 attibute&#xff1a;字段/属性 Value&#xff1a;值 2、重复/转换/替换/原始字符号 upper&#xff1a;上面 lower&#xff1a;下面 capitalize&#xff1a;用大写字母写或印刷 title&#xff1a;标题…

03、第一个 Java 程序运行过程以及运行过程中常见的问题及解决方案

第一个 Java 程序运行 1、新建文本文件并以 .java 结尾&#xff1a;其一、第一个 java 程序的代码为&#xff1a;其二、代码截图为&#xff1a; 2、 .java 文件编译的过程&#xff1a;其一、将 Java 代码编写到扩展名为 .java 的文件中(即&#xff1a;源文件)&#xff1a;其二、…

若依前后端分离版 集成 腾讯云 COS

原因&#xff1a; 最近在根据一个若依二开的项目继续进行开发&#xff0c;当添加到轮播图模块的时候&#xff0c;涉及到了图片上传&#xff0c;由于公司以前一直使用的是腾讯云COS&#xff08;不是阿里云OSS&#xff09;&#xff0c;在网上搜索一番后&#xff0c;没有找到 若依…

【笔记目录】

目录 001、流程 - - 入金申请 002、流程 - - 出金申请 003、流程 - - 用户注册 004、关系 - - 客服业绩统计报表 005、单词 - - 业务单词

亚信安慧AntDB:挑战的创新之道

在当今快速变化的商业环境中&#xff0c;企业需要能够快速适应业务需求的变化&#xff0c;并能够实现数据的实时更新和处理&#xff0c;以便及时获取最新信息和洞察。AntDB作为一种创新的数据库解决方案&#xff0c;正是能够满足这些需求的利器。 AntDB以其强大的功能和灵活的…

浏览器原理---浏览器本地存储

1、浏览器本地存储方式及使用场景 &#xff08;1&#xff09;Cookie Cookie是最早被提出来的本地存储方式&#xff0c;在此之前&#xff0c;服务端是无法判断网络中的两个请求是否是同一用户发起的&#xff0c;为解决这个问题&#xff0c;Cookie就出现了。Cookie的大小只有4kb&…

深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作

码到三十五 &#xff1a; 个人主页 OceanBase与MySQL模式下兼容性序 在当今的大数据时代&#xff0c;数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库&#xff0c;在与MySQL模式的兼容性方面展现出了显著的优势&#xff0c…

【SpringBoot】数据脱敏

文章目录 什么是数据脱敏JsonSerialize自定义Jackson注解定制脱敏策略定制JSON序列化实现脱敏工具类 定义Person类&#xff0c;对其数据脱敏模拟接口测试总结 什么是数据脱敏 数据脱敏&#xff0c;也称为数据的去隐私化或数据变形&#xff0c;是一种技术手段&#xff0c;用于对…

vue各种时间类型转换

时间范围[2024-04-17 14:36:27, 2024-04-24 14:36:27] console.log(this.$getRecentDays()); 页面使用默认7天 也可以指定console.log(this.$getRecentDays(30)); [2024-04-17 14:36:27, 2024-04-24 14:36:27] 默认值 function getDateString (date, fmt yyyy-MM-dd) {if…

【问题实操】银河高级服务器操作系统实例分享,配置hugepages启动异常

1.问题现象 某运营商国产服务器操作系统项目&#xff0c;部署Kylin-Server-0524-aarch64服务器系统&#xff0c;内核从4.19.90-24.4升级到4.19.90-25.14。在grub中配置huagepages大页内存后&#xff0c;系统在内核启动阶段黑屏&#xff0c;只显示一个光标。grub配置如下图&…

Vue3框架

Vue3框架 一.使用create-vue搭建Vue3项目二.组合式API - setup选项1.setup选项的写法和执行时机2.setup中写代码的特点3. script setup 语法糖 三.组合式API - reactive和ref函数1. reactive2. ref3. reactive 对比 ref 四.组合式API - computed五.组合式API - watch1. 侦听单个…

Gone框架介绍3 - 使用gone命令,自动生成Priest函数

文章目录 1. 安装辅助工具: gone2. 创建一个名为gen-code的新项目3. 创建Goner4. 使用辅助工具5. 添加main函数 我在两年前实现了一个Golang的依赖注入框架&#xff0c;并且集成了gin、xorm、redis、cron、消息中间件等功能&#xff0c;自己觉得还挺好用的&#xff1b;之前一直…

Linux Mint 21.3 “Virginia“ 简介

Linux Mint 21.3 "Virginia" 是Linux Mint项目发布的最新版本&#xff0c;这个版本基于Ubuntu 22.04 LTS&#xff08;Jammy Jellyfish&#xff09;&#xff0c;并提供了三个主要的桌面环境&#xff1a;Cinnamon、MATE和Xfce。每个桌面环境都有其独特的特点和优势&…

Unity射击游戏开发教程:(8)构建 UI 元素:添加分数显示

用户界面决定用户如何与屏幕交互。UI 适用于所有类型的游戏和应用程序,在此示例中,我们将为我的太空射击游戏设置一个简单的记分板。 第一步是在层次结构中创建一个 UI 元素。只需在层次结构中右键单击,滚动 UI 并选择要添加的 UI 元素类型。在本例中,我们将使用文本元素。…

编程新手如何快速提升编码能力?

编程新手想要快速提升编码能力&#xff0c;可以遵循以下几个策略&#xff1a; 基础扎实&#xff1a;首先&#xff0c;确保你对所学编程语言的基础概念有深刻理解&#xff0c;包括变量、数据类型、控制结构&#xff08;如循环、条件语句&#xff09;、函数、类和对象&#xff08…

使用 Docker 自建一款怀旧游戏之 - 扫雷

1&#xff09;扫雷 简介 扫雷 是一种经典的单人电脑游戏&#xff0c;最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中。游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块&#xff0c;而不触发地雷。每个方块上都标有数字&#xff0c;表示周围 8 个方块中…

Java网址url工具类

功能描述 无需引入三方依赖文本匹配网址&#xff08;支持多个&#xff09;网址解析&#xff08;包括协议、主机、路径、参数等&#xff09; package com.qiangesoft.image.utils;import org.springframework.util.Assert; import org.springframework.util.CollectionUtils;i…

行为学学习记忆实验和抗焦虑实验两款硬件

安徽耀坤XWX-BM八臂迷宫实验&#xff08;Eight-arm Maze Test&#xff0c;RMT&#xff09;由八个完全相同的臂组成&#xff0c;这些臂从一个中央平台放射出来&#xff0c;所以又被称为放射迷宫。其基本方式是&#xff1a;训练动物受食物的驱使对迷宫的各臂进行探究&#xff0c;…

xLua背包实践

准备工作 环境&#xff0c;代码 在C#代码方面我们需要准备单例模式基类&#xff0c;AB包管理器&#xff0c;lua解析器管理器 详情请见AB包管理器 xlua详解 然后是Xlua包和AB包&#xff0c;具体导入方法也在上面的链接中 然后是lua的三个文件 具体代码&#xff1a; JsonUtil…