成都工程网站建设,财经门户网站开发,学风建设网站,西宁思帽网站建设算法-01背包 前置知识
DP 思路
01背包一般分为两种#xff0c;不妨叫做价值01背包和判断01背包。
价值01背包
01背包问题是这样的一类问题#xff1a;给定一个背包的容量 m m m 和 n n n 个物品#xff0c;每个物品有重量 w w w 和价值 v v v#xff0c;求不超过背…算法-01背包 前置知识
DP 思路
01背包一般分为两种不妨叫做价值01背包和判断01背包。
价值01背包
01背包问题是这样的一类问题给定一个背包的容量 m m m 和 n n n 个物品每个物品有重量 w w w 和价值 v v v求不超过背包容量时可以装下的最大价值。 对于这类问题我们使用DP设 f i , j f_{i,j} fi,j 为考虑前 i i i 个物品时总重恰好为 j j j 的最大价值和。 容易得到DP方程 f i , j max ( f i − 1 , j , f i − 1 , j − w v ) f_{i,j}\max(f_{i-1,j},f_{i-1,j-w}v) fi,jmax(fi−1,j,fi−1,j−wv)
判断01背包
思路类似方程变为 f i , j f i − 1 , j ∣ f i − 1 , j − w v f_{i,j}f_{i-1,j}\mid f_{i-1,j-w}v fi,jfi−1,j∣fi−1,j−wv 即可 算法参数
时间复杂度 Θ ( n m ) \Theta(nm) Θ(nm)空间复杂度 Θ ( n m ) \Theta(nm) Θ(nm) 滚动优化
滚动优化是动态规划中最常见的空间优化了。 容易发现在动态转移方程中有 f i , j max ( f i − 1 , j , f i − 1 , j − w v ) f_{i,j}\max(f_{i-1,j},f_{i-1,j-w}v) fi,jmax(fi−1,j,fi−1,j−wv) 注意到第一维仅仅继承上一轮循环的状态可以把这一维删掉。 我们注意到每次从前往后枚举 j j j前面的状态已经被更新了于是不妨倒过来循环此时前面的数据还是上一次的结果拿过来用即可。 算法参数
时间复杂度 Θ ( n m ) \Theta(nm) Θ(nm)空间复杂度 Θ ( n m ) \Theta(nm) Θ(nm) 实现代码
价值
f[0]0;
for (int i1;in;i)for (int jm;jw[i];j--)f[j]max(f[j],f[j-w[i]]v[i]);判断
f[0]1;
for (int i1;in;i)for (int jm;jw[i];j--)f[j]f[j]|f[j-w[i]];练习
P1048P1049P1734