动态规划(Dynamic Programming)—— Java解释

一、基本思想

动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,并将子问题的求解结果存储起来避免重复求解,从而一步步获取最优解的处理算法。

动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )

动态规划的特性主要包括:

  1. 分解原问题:动态规划将原问题分解为若干个相似的子问题,这些子问题之间相互独立,并且每个子问题只需要解决一次。
  2. 储存子问题的解:动态规划会储存子问题的解,以避免重复计算,这是动态规划能够高效解决复杂问题的关键。
  3. 状态转移方程:动态规划的本质在于对问题状态的定义和状态转移方程的定义(状态以及状态之间的递推关系)。
  4. 无后效性:每个状态都是"过去历史的一个完整总结",也就是说,每个状态都包含了它过去的历史信息,而不会受到未来状态的影响。
  5. 阶段性和相互联系性:动态规划通常将问题划分为若干个阶段,每个阶段都对应着一组状态,这些状态之间相互联系,构成了整个问题的状态转移过程。
  6. 决策变量和允许决策集合:在动态规划中,每个阶段都包含若干个决策变量,这些决策变量的取值范围称为允许决策集合。
  7. 状态变量和状态集合:描述各阶段状态的变量称为状态变量,常用sk表示第k阶段的状态变量,状态变量sk的取值集合称为状态集合,用Sk表示。

二、案例说明------背包问题

动态规划可以通过填表的方式来逐步推进,得到最优解。在填表法中,会为每个子问题预先计算出最优解并填入表中,然后通过查表来获取原问题的最优解。

背包问题:有一个背包,容量为4磅 , 现有如下物品

物品 重量 价格
吉他(G) 1 1500
音响(S) 4 3000
电脑(L) 3 2000
  1. 要求达到的目标为装入的背包的总价值最大,并且重量不超出
  2. 要求装入的物品不能重复

背包问题主要是指一个给定容量的背包、若干具有一定价值和重量的物品,如何选择物品放入背包使物品的价值最大。其中又分01背包和完全背包(完全背包指的是:每种物品都有无限件可用)

这里的问题属于01背包,即每个物品最多放一个。而无限背包可以转化为01背包。

思路: 利用动态规划来解决。

假设背包容量为weight,有 n 个物品,每个物品的重量为 w[i],价值为 v[i]。

  1. 设 dp[i][j] 表示前 `i` 个 物品,容量为j时的最大价值。 ------ 定义动态规划的状态,通常是数组或集合。
  2. dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]),表示在第i个物品和不放第i个物品中选取一个最优解。 ------ 定义状态转移方程,根据问题最优解的定义,确定状态之间的转移关系。
  3. dp[0][j] = 0,表示不选择任何物品时的价值为0。------ 确定最基本的子问题的解作为边界条件。
  4. 填表,从第一个物品开始填表直到最后一个物品。------ 每个子问题的最优解填入对应的状态位置。
  5. 查询最优解,dp[n][weight] 即前n个物品,容量为w时的最大价值。 ------ 根据需求解的问题的目标状态去查询对应子问题的最优解。
java 复制代码
public staic int knapsack(int[] w, int[] v, int weight) {
	int n = w.length;
	int[][] dp = new int[n + 1][weigth + 1];
	for (int i = 0; i <= n; i++) {
		for (int j = 0; j <= weigth; j++) {
			if (i == 0 || j == 0) {
				dp[i][j] = 0;
			} else if (j < w[i - 1]) {
				dp[i][j] = dp[i - 1][j];
			} else {
				dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);
			}
		}
	}
	return dp[n][weight];
}
相关推荐
垆边人似月.1 分钟前
最少的元素个数使和为 target
数据结构·c++·算法
炽橙超真云2 分钟前
2D 工程图纸如何自动转成可编辑 3D 模型?拆解读图与建体两条技术路径(DXF/DWG/PDF 到 STEP)
算法·3d·工业智能·工业ai
金銀銅鐵10 分钟前
[Java] 用 GUI 展示 ArrayList 扩容的过程
java·后端·ai编程
夕除11 分钟前
redis--dict rehash
算法·哈希算法
磊 子12 分钟前
什么是虚假唤醒(spurious wakeup)?从 POSIX 标准讲到 futex 内核
java·开发语言
飘然生23 分钟前
traceId链路 skywalking java agent
java·开发语言·skywalking
云上先途126 分钟前
Agent 轨迹数据一般包含哪些内容,加工的核心目标是什么?
人工智能·算法·机器学习
IT研究室29 分钟前
最新计算机毕业设计选题推荐-基于spring boot的母婴全程服务管理系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
CRMEB38 分钟前
商品 SKU 设计,从简单规格到多规格踩过什么
java·前端·数据库·开源
霸道流氓气质39 分钟前
基于 Spring @Profile 的 MQ 消费者按需开关设计
java·后端·spring