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

网站程序国内 wordpress主题

网站程序,国内 wordpress主题,网站开发工程师需要会写什么,手机网站pc网站01背包问题 - 动态规划最优解法(Java实现) 问题描述 01背包问题是经典的动态规划问题: 有一个容量为 W 的背包有 n 个物品,每个物品有重量 weights[i] 和价值 values[i]每个物品只能选择一次(要么选0个,要么…

01背包问题 - 动态规划最优解法(Java实现)

问题描述

01背包问题是经典的动态规划问题:

  • 有一个容量为 W 的背包
  • n 个物品,每个物品有重量 weights[i] 和价值 values[i]
  • 每个物品只能选择一次(要么选0个,要么选1个)
  • 目标:在不超过背包容量的前提下,使背包中物品总价值最大

最推荐的Java解决方案

public static int knapsack(int[] weights, int[] values, int capacity) {int n = weights.length;// dp[i][w]表示前i个物品放入容量为w的背包中能获得的最大价值int[][] dp = new int[n + 1][capacity + 1];// 填充dp表for (int i = 1; i <= n; i++) {for (int w = 1; w <= capacity; w++) {// 当前物品的重量和价值(注意索引转换)int weight = weights[i - 1];int value = values[i - 1];if (weight <= w) {// 当前物品重量不超过背包容量,可以选择// 取不选择和选择当前物品的最大值dp[i][w] = Math.max(dp[i - 1][w], dp[i - 1][w - weight] + value);} else {// 当前物品重量超过背包容量,不能选择dp[i][w] = dp[i - 1][w];}}}return dp[n][capacity];
}

关键变量详解

变量含义作用
dp[i][w]前i个物品放入容量为w的背包能获得的最大价值状态定义,存储子问题的最优解
n物品总数确定dp数组的行数
capacity背包容量确定dp数组的列数
weight当前考虑物品的重量判断是否能放入背包
value当前考虑物品的价值计算选择该物品后的总价值
i当前考虑到第i个物品循环控制变量,表示子问题规模
w当前考虑的背包容量循环控制变量,表示子问题的容量限制

完整可视化演示

使用测试用例:

  • 物品信息:[重量: [2,3,4,5], 价值: [1,4,5,7]]
  • 背包容量:8

初始化阶段

DP表初始状态(dp[i][w] = 0):w=0  w=1  w=2  w=3  w=4  w=5  w=6  w=7  w=8
i=0     0    0    0    0    0    0    0    0    0
i=1     0    0    0    0    0    0    0    0    0  
i=2     0    0    0    0    0    0    0    0    0
i=3     0    0    0    0    0    0    0    0    0
i=4     0    0    0    0    0    0    0    0    0

逐步填充过程

第1轮:考虑物品1 (重量=2, 价值=1)
当前物品:物品1 [重量=2, 价值=1]

填充 dp[1][1]

  • weight=2 > w=1分支1:不能选择
  • dp[1][1] = dp[0][1] = 0

填充 dp[1][2]

  • weight=2 <= w=2分支2:可以选择
  • 不选:dp[0][2] = 0
  • 选择:dp[0][2-2] + 1 = 0 + 1 = 1
  • dp[1][2] = Math.max(0, 1) = 1

填充 dp[1][3] 到 dp[1][8]

  • 都满足 weight=2 <= w,选择物品1更优
  • dp[1][3] = dp[1][4] = ... = dp[1][8] = 1
第1轮完成后:w=0  w=1  w=2  w=3  w=4  w=5  w=6  w=7  w=8
i=0     0    0    0    0    0    0    0    0    0
i=1     0    0    1    1    1    1    1    1    1  ← 新填充
i=2     0    0    0    0    0    0    0    0    0
i=3     0    0    0    0    0    0    0    0    0
i=4     0    0    0    0    0    0    0    0    0
第2轮:考虑物品2 (重量=3, 价值=4)
当前物品:物品2 [重量=3, 价值=4]

关键计算 dp[2][5]

  • weight=3 <= w=5分支2:可以选择
  • 不选:dp[1][5] = 1
  • 选择:dp[1][5-3] + 4 = dp[1][2] + 4 = 1 + 4 = 5
  • dp[2][5] = Math.max(1, 5) = 5关键比较分支
第2轮完成后:w=0  w=1  w=2  w=3  w=4  w=5  w=6  w=7  w=8
i=0     0    0    0    0    0    0    0    0    0
i=1     0    0    1    1    1    1    1    1    1
i=2     0    0    1    4    4    5    5    5    5  ← 新填充
i=3     0    0    0    0    0    0    0    0    0
i=4     0    0    0    0    0    0    0    0    0
第3轮:考虑物品3 (重量=4, 价值=5)
当前物品:物品3 [重量=4, 价值=5]

关键计算 dp[3][7]

  • weight=4 <= w=7分支2:可以选择
  • 不选:dp[2][7] = 5
  • 选择:dp[2][7-4] + 5 = dp[2][3] + 5 = 4 + 5 = 9
  • dp[3][7] = Math.max(5, 9) = 9关键比较分支
第3轮完成后:w=0  w=1  w=2  w=3  w=4  w=5  w=6  w=7  w=8
i=0     0    0    0    0    0    0    0    0    0
i=1     0    0    1    1    1    1    1    1    1
i=2     0    0    1    4    4    5    5    5    5
i=3     0    0    1    4    5    6    9    9    9  ← 新填充
i=4     0    0    0    0    0    0    0    0    0
第4轮:考虑物品4 (重量=5, 价值=7)
当前物品:物品4 [重量=5, 价值=7]

关键计算 dp[4][8]

  • weight=5 <= w=8分支2:可以选择
  • 不选:dp[3][8] = 9
  • 选择:dp[3][8-5] + 7 = dp[3][3] + 7 = 4 + 7 = 11
  • dp[4][8] = Math.max(9, 11) = 11关键比较分支

填充 dp[4][4]

  • weight=5 > w=4分支1:不能选择
  • dp[4][4] = dp[3][4] = 5
最终DP表:w=0  w=1  w=2  w=3  w=4  w=5  w=6  w=7  w=8
i=0     0    0    0    0    0    0    0    0    0
i=1     0    0    1    1    1    1    1    1    1
i=2     0    0    1    4    4    5    5    5    5
i=3     0    0    1    4    5    6    9    9    9
i=4     0    0    1    4    5    7   10   11   11  ← 最终答案

代码分支覆盖分析

通过上述演示用例,我们完全覆盖了Java代码的所有分支:

分支1:weight > w(不能选择)

  • 触发位置:dp[1][1], dp[4][4] 等
  • 代码执行dp[i][w] = dp[i-1][w]
  • 说明:当前物品太重,无法放入背包

分支2:weight <= w(可以选择)

  • 触发位置:dp[1][2], dp[2][5], dp[3][7], dp[4][8] 等
  • 代码执行dp[i][w] = Math.max(dp[i-1][w], dp[i-1][w-weight] + value)

Math.max的比较分支

  • 不选更优:dp[2][3] = max(1, 4) → 选择4
  • 选择更优:dp[2][5] = max(1, 5) → 选择5
  • 关键比较:dp[4][8] = max(9, 11) → 选择11

算法复杂度

  • 时间复杂度:O(n × capacity),需要填充 n×capacity 个状态
  • 空间复杂度:O(n × capacity),需要存储 n×capacity 个状态

最终答案

通过动态规划,我们得到最优解是 11,对应的最优选择方案是:

  • 选择物品2(重量=3,价值=4)
  • 选择物品4(重量=5,价值=7)
  • 总重量:3+5=8 ≤ 8 ✓
  • 总价值:4+7=11

这个解法简洁易懂,逻辑清晰,是01背包问题的最推荐实现方式。

http://www.dtcms.com/a/529081.html

相关文章:

  • 太仓公司网站建设电话天津企业网站建设方案
  • AI 浏览器技术趋势分析:Perplexity Comet 的创新与早期用户激励机制探讨
  • 4.基础开发工具(一)
  • 网站如何调用微博wordpress 发布视频
  • SQL注入第一步:数据库类型判断
  • 软件架构师个人总结笔记
  • 免费发做网站怎么申请网站空间域名
  • 建设旅游网站的功能定位seo网站排名优化方案
  • 龙岗网站设计案例网站是什么字体
  • 《锁侠闯江湖:小白通关Java synchronized底层秘境》
  • 广州网站制作公司排名寿光网站优化
  • Python如何写Selenium全攻略
  • 【大模型的原理 - 从输入到输出】Transformer 的 Decoder-only 架构
  • 网站建设前置审批网站配色主题
  • 服务器pdb断点调试
  • 一次方的高阶无穷小 = 一次方 × 无穷小
  • 网站建设请款报告广东建设工程信息网官网首页
  • 【力扣hot100】238.除自身以外数组的乘积
  • 江门网站关键词推广seo关键词优化软件合作
  • 如何解决 pip install 安装报错 Backend ‘setuptools.build_meta’ 不可用 问题
  • C++智能指针使用指南(auto_ptr, unique_ptr, shared_ptr, weak_ptr)
  • GitHub等平台形成的开源文化正在重塑知可以谈人
  • 计算机网络:知识点梳理及讲解(三)数据链路层
  • PySide6 pyside6-deploy 命令 Linux 部署
  • 网站内的搜索怎么做的学校网站建设情况报告
  • 电脑建立网站朝阳区手机网站建设服务
  • 谷歌商店下载APK教程,先下载谷歌三件套,再直接从 Google Play 下载 APK 文件?
  • Spring中事务的传播行为
  • 将镜像推送到 Docker Hub 或私有仓库
  • 做qq图片的网站吗wordpress没有链接地址