贪心算法+动态规划

动规是由前一个状态推导出来的,而贪心是局部直接选最优的。

对于动态规划问题可以拆解成以下五步曲:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组
背包问题

二维dp数组

横轴表示物品编号,纵轴表示背包的重量

  • 不放物品i:背包容量为j,里面不放物品i的最大价值是dp[i - 1][j]。

  • 放物品i:背包空出物品i的容量后,背包容量为j - weight[i],dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值

递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

dp[j]容量为j的背包所能装的最大重量

一维dp数组递推公式dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

目标和

要使表达式结果为target,既然为target,那么就一定有 left组合 - right组合 = target。left + right = sum,而sum是固定的。right = sum - left。left - (sum - left) = target 推导出 left = (target + sum)/2 。target是固定的,sum是固定的,left就可以求出来。此时问题就是在集合nums中找出和为left的组合

完全背包

递推公式:dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]);

  • 不放物品i:背包容量为j,里面不放物品i的最大价值是dp[i - 1][j]。

  • 放物品i:背包空出物品i的容量后,背包容量为j - weight[i],dp[i][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值,那么dp[i][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值

相关推荐
Unstoppable221 小时前
代码随想录算法训练营第 55 天 | 53. 寻宝(Prim + Kruskal)
数据结构·算法··kruskal·prim
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——数青蛙
算法·leetcode·动态规划·结构与算法
m0_639397291 小时前
代码随想录算法训练营第三十九天|198.打家劫舍,213.打家劫舍II,337.打家劫舍III
算法
heisd_11 小时前
KNN 算法和 K means算法和 Q-Learning 算法(简单的理解)
算法
TL滕1 小时前
从0开始学算法——第六天(进阶排序算法)
笔记·学习·算法·排序算法
TL滕2 小时前
从0开始学算法——第六天(进阶排序算法练习)
笔记·python·学习·算法·排序算法
課代表2 小时前
正弦函数与椭圆的关系
数学·算法·几何·三角函数·椭圆·正弦·周长
zl_vslam2 小时前
SLAM中的非线性优-3D图优化之相对位姿Between Factor(七)
人工智能·算法·计算机视觉·3d
CoderYanger2 小时前
动态规划算法-简单多状态dp问题:12.打家劫舍Ⅱ
开发语言·算法·leetcode·职场和发展·动态规划·1024程序员节