贪心算法+动态规划

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

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

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

相关推荐
05Kevin3 小时前
lk每日冒险题--数据结构6.27
算法
To_OC14 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安19 小时前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者21 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
kisshyshy1 天前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC2 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635072 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法