本质理解为:有限集中的最值求解。
分析问题分为两个阶段:
状态表示:化零为整
每次枚举一个有相似性的子集,用一个状态$f_i$来表示。
状态计算:化整为零
集合划分要求不重复、不遗漏;求每一个子集。
如:$\max(\{{A,B,C,D}\})=\max(\{A_{\max},\cdots)$
划分依据:寻找最后一个不同点
动态规划大都是经验题目,需要同类型题目的练习。
$N$物品,$V$容量,每个物品只能用一次;体积$v_i$,价值$w_i$,求最大重量。
分析:有限求值问题→有限集合的求值问题,找到$2^n$个情况中最大的。
暴力朴素方法:枚举$2^n$个情况。
状态表示$f(i,j)$
状态计算:寻找最后一个不同点
注意有时候子集可以是空的,如不满足重量情况时子集为空。
得到状态转移方程:$f(i,j)=\max(f(i-1,j),f(i-1,j-v_i)+w_i)$
**进一步优化:**空间优化。
观察得知,每次只用到一次$i$,故可以用滚动数组,省一维储存空间。