贪心算法+动态规划

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

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

  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得到的最大价值

相关推荐
June`30 分钟前
全排列与子集算法精解
算法·leetcode·深度优先
徐先生 @_@|||33 分钟前
Palantir Foundry 五层架构模型详解
开发语言·python·深度学习·算法·机器学习·架构
夏鹏今天学习了吗1 小时前
【LeetCode热题100(78/100)】爬楼梯
算法·leetcode·职场和发展
m0_748250032 小时前
C++ 信号处理
c++·算法·信号处理
Ro Jace3 小时前
电子侦察信号处理流程及常用算法
算法·信号处理
yuyanjingtao3 小时前
动态规划 背包 之 凑钱
c++·算法·青少年编程·动态规划·gesp·csp-j/s
core5124 小时前
SGD 算法详解:蒙眼下山的寻宝者
人工智能·算法·矩阵分解·sgd·目标函数
Ka1Yan4 小时前
[链表] - 代码随想录 707. 设计链表
数据结构·算法·链表
scx201310044 小时前
20260112树状数组总结
数据结构·c++·算法·树状数组