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

动态规划:01 背包(闫氏DP分析法)

动态规划:01 背包(闫氏DP分析法)

01 背包

www.acwing.com/problem/content/2/

在这里插入图片描述

DP:

  • 状态表示 f(i, j)

    • 集合:所有只考虑前 i i i 个物品,且总体积不超过 j j j 的选项的集合

    • 属性:max

      • 最终答案:f(N, V)
  • 状态计算:f(i, j) = max(f(i - 1, j), f(i - 1, j - v[i]) + w[i])

    • 选第 i i i 个物品:所有包含第 i i i 个物品的选项集合,其实需要找的就是变化的部分的最大值,即:从 1 1 1~ i − 1 i-1 i1 中选择,且总体积小于等于 j − v [ i ] j-v[i] jv[i] 的选项集合

      j < v [ i ] j < v[i] j<v[i] 时,该分支不存在

      • 变化的部分:包含前 i − 1 i-1 i1 个物品的不同选项
      • 不变的部分:都需要包含第 i i i 个物品
    • 不选第 i i i 个物品:需要满足从 1 1 1~ i − 1 i-1 i1 中选择,且总体积小于等于 j j j 的所有选项集合

二维朴素写法

import java.util.*;public class Main {static final int N = 1010;// f[i][j] 表示只对于前i个物品且使用j的背包空间,选取的所有方案中的最大值static int[][] f = new int[N][N];static int[] w = new int[N];static int[] v = new int[N];public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int V = sc.nextInt();for (int i = 1; i <= n; i++) {v[i] = sc.nextInt();w[i] = sc.nextInt();}// dpfor (int i = 1; i <= n; i++) {for (int j = 0; j <= V; j++) {if (j >= v[i]) {// j >= v[i] 能够将第i个物品放入// 放入第i个物品f[i][j] = f[i - 1][j - v[i]] + w[i];}// 不放入第i个物品f[i][j] = Math.max(f[i][j], f[i - 1][j]);}}System.out.println(f[n][V]);}
}

一维优化写法

import java.util.*;public class Main {static final int N = 1010;// 一维优化,相当于每次的i直接覆盖在上一次的i-1数组上// 因为每一次只会用到上一层的,不会用到更上面的数据// 且每次j-v[i]只会用在j之前的,当使用从大到小遍历时,当前修改不会影响到后面的答案// 所以可以使用滚动数组优化static int[] f = new int[N];static int[] w = new int[N];static int[] v = new int[N];public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int V = sc.nextInt();for (int i = 1; i <= n; i++) {v[i] = sc.nextInt();w[i] = sc.nextInt();}// dpfor (int i = 1; i <= n; i++) {// 想清楚为什么要从大到小// 因为遍历到j时要使用上一层的j-v[i],所以应当先遍历大的才能避免影响for (int j = V; j >= 0; j--) {if (j >= v[i]) {// j >= v[i] 能够将第i个物品放入// 不放入第i个物品, 放入第i个物品f[j] = Math.max(f[j], f[j - v[i]] + w[i]);    }}}System.out.println(f[V]);}
}
http://www.lryc.cn/news/572500.html

相关文章:

  • python脚本间的相互调用
  • 磐基PaaS平台MongoDB组件SSPL许可证风险与合规性分析(上)
  • Git(三):分支管理
  • 达梦数据库锁超时问题
  • 使用Dagster资产工厂模式高效管理重复ETL任务
  • 识别网络延迟与带宽瓶颈
  • M1芯片macOS安装Xinference部署大模型
  • Datawhale 网络爬虫技术入门第2次笔记
  • QT6与VS下实现没有CMD窗口的C++控制台程序
  • 日本生活:日语语言学校-日语作文-沟通无国界(3)-题目:わたしの友達
  • 编程马拉松的定义、运作与发展
  • C语言标准I/O库详解:文件操作与缓冲区机制
  • Qt蓝图式技能编辑器状态机模块设计与实现
  • html实现登录与注册功能案例(不写死且只使用js)
  • 深入解析select模型:FD_SET机制与1024限制的终极指南
  • Linux系统远程操作和程序编译
  • 23.ssr和csr的对比?如何依赖node.js实现
  • [11-5]硬件SPI读写W25Q64 江协科技学习笔记(20个知识点)
  • 嵌入式编译工具链熟悉与游戏移植
  • 基于C#的Baumer相机二次开发教程
  • OpenSSL引擎 + PKCS11 + SoftHSM2认证
  • WHAT - React Native 开发 App 从 0 到上线全流程周期
  • 【嵌入式】鲁班猫玩法大全
  • 第1章: 伯努利模型的极大似然估计与贝叶斯估计
  • 软件工程(期末复习班)
  • 23种设计模式--简单工厂模式理解版
  • Arduino Nano 33 BLE Sense Rev 2开发板使用指南之【外设开发】
  • 零基础指南:利用Cpolar内网穿透实现Synology Drive多端笔记同步
  • Linux基本指令篇 —— mkdir指令
  • MFC中使用CRichEditCtrl控件让文本框中的内容部分加粗