【题目练习】动态规划+背包问题

题一:分割等和子集

解题思路:

1、求数组总和 sum,如果 sum%2 !=0 → 直接返回 false

2、target = sum / 2,相当于背包容量 target,看能不能凑出总和 target

3、dp j:容量 j 的背包,能凑出的最大和

3、递推公式:dpj = max(dpj, dpj - nums\[i] + numsi)

4、遍历:物品正序,容量倒序

5、最后判断 dp target == target?相等说明可以分割

计算数组总和

遍历所有数字

累加求和

总和是奇数,不可能平分

背包目标容量,需要凑出target

开辟dp数组,dpj代表容量j背包能凑的最大和

dp全部初始化为0

遍历物品(每个数字就是物品,重量=价值=numsi)

01背包:容量倒序,从target往numsi遍历

递推公式:不选numsi就是dpj;选就是dpj-nums\[i]+numsi,取大

最大和刚好等于target,代表可以平分

释放动态数组,防止内存泄漏

题目二:爬楼梯

解题思路:

1、dp数组定义:dpi:爬到第 i 阶楼梯的方案数量

2、递推公式:dpi = dpi-1 + dpi-2

3、到第 i 阶,最后一步要么走 1 阶(前面 i-1 阶),要么走 2 阶(前面 i-2 阶),方案相加

4、初始化:dp 1=1,dp 2=2

5、遍历顺序:从小到大正序遍历

边界:1层楼梯,只有1种方案

边界:2层楼梯,1+1 或者 2,共2种方案

1、dp数组,dpi:爬到i阶台阶的方案数

2、初始化:1阶,方案1

3、初始化:2阶,方案2

1、从第3阶开始一直到n阶,正向遍历

2、递推公式,两种方案相加

释放内存

n=4输出5

相关推荐
启观川4 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
Logic1015 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
YOLO数据集集合6 小时前
建筑物坍塌程度检测数据集 | 建筑物坍塌 灾害评估 坍塌程度 目标检测 9180期
人工智能·目标检测·计算机视觉·建筑·建筑损害
flinn_small7 小时前
三分算法:原理、实现与实战应用
数据结构·算法·三分
INGNIGHT8 小时前
944 · 最大子矩阵(前缀和)
数据结构·c++·算法
All for pursuit.9 小时前
【动态规划-6】96.不同的二叉搜索树
数据结构·c++·算法·leetcode·动态规划
信奥卷王9 小时前
[GESP202609 六级] 数组划分
数据结构·算法
All for pursuit.11 小时前
【并查集-2】399.除法求值
数据结构·c++·算法·leetcode
殷色玫瑰13 小时前
AVL树:从平衡因子到四种旋转的完整实现
c语言·数据结构·c++·算法·visualstudio
2502_9385302214 小时前
周报9.27
目标检测