题一:分割等和子集
解题思路:
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
