贪心算法+动态规划

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

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

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

二维dp数组

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

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

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

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

dpj容量为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的组合

完全背包

递推公式:dpij = max(dpi - 1j, dpij - weight\[i] + valuei);

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

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

相关推荐
QXWZ_IA3 小时前
1库1图1批是什么?千寻位置公安地图数据体系详解
科技·算法·能源·媒体·交通物流·政务
c238564 小时前
Bug 猎手入门指南
c++·算法·bug
Reart4 小时前
Leetcode 213.打家劫舍2(内含闲谈,打劫真是技术活,好题,716)
后端·算法
Reart5 小时前
Leetcode 198.打家劫舍(716)
后端·算法
Jerry5 小时前
LeetCode 110. 平衡二叉树
算法
玖玥拾5 小时前
C++ 数据结构 八大基础排序算法专题
数据结构·c++·算法·排序算法
Tim_106 小时前
【C++】017、new/delete与malloc/free的区别
java·数据结构·算法
从零开始的代码生活_6 小时前
C++ list 原理与实践:双向链表、迭代器与简化实现
开发语言·c++·后端·学习·算法·链表·list
ttod_qzstudio7 小时前
【软考算法】软件设计师下午第四题之动态规划:0-1 背包与最长公共子序列的“填表艺术“
算法·动态规划·软考