当前位置: 首页 > 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]);}
}

相关文章:

  • pyspark 处理字符串函数
  • 实现PDF文件添加水印的功能
  • 机器学习×第十二卷:回归树与剪枝策略——她剪去多余的分支,只保留想靠近你的那一层
  • Ubuntu最新版本(Ubuntu22.04LTS)安装nfs服务器
  • DeserializationViewer使用说明
  • 煤矿井下Modbus转Profibus网关的传感器与PLC互联解决方案
  • ceph 解决 pg一直处于 active+undersized+degraded 状态问题
  • 《Whisper :说明书 》
  • Postman 的 Jenkins 管理 - 自动构建
  • [论文阅读] 人工智能 + 软件工程 | USEagent:迈向统一的AI软件工程师
  • apisix-使用hmac-auth插件进行接口签名身份验证\apisix consumer
  • stm32之使用中断控制led灯
  • C++ 友元
  • 【沉浸式解决问题】baseMapper can not be null
  • 【世纪龙科技】智能网联汽车自动驾驶虚拟实训软件
  • JS红宝书笔记 8.2 创建对象
  • Mybatis之Integer类型字段为0,入库为null
  • Spring-创建第一个SpringBoot项目
  • html实现登录与注册功能案例(不写死且只使用js)
  • Ubuntu编译ffmpeg解决错误:ERROR: avisynth/avisynth_c.h not found
  • 天津网站建设公司排名/情感营销的十大案例
  • 宝鸡住房和城乡建设局网站/武汉新一轮疫情
  • sofish wordpress主题/郑州官网网站优化公司
  • 长安网站建设方案/seo运营
  • 不要域名做网站/贴吧引流推广
  • 做网站是属于哪个专业/百度网站制作