【D1,2】 贪心算法刷题

文章目录

  • 不同路径 II
  • 整数拆分
  • 二叉搜索树组合
  • 背包问题
  • 相等子序列

不同路径 II

初始化的时候不能整列初始化为1,因为如果有障碍物,后面的都不能到达
也不能整列初始化为0,因为状态转移的时候第一行第一列都没有检查,因此不能部分初始化

整数拆分

需要考虑几种情况:
当前值,
当前值拆分成两个部分(因为很小的数字拆的越多乘积越小)
当前值拆成n个部分(此时前面一定是n个部分的最大值)

二叉搜索树组合

总共n个节点
任选一个节点j作为中间节点
他的左边一定是比他小的节点:j-1
右边是比他大的节点:n-j
进行迭代

背包问题

做起来让人觉得我的命好苦

放或不放
初始化问题:若背包容量 j 大于等于第一个物品的重量,则第一个物品一定能放入
假定package大小=weight0的大小,那么从这以后的所有package大小都能装进第一个物品了

package大小可变的原因:要计算出最大背包重量-当前物品放进去后的重量的插值,package可变大小是一个暂时状态

循环顺序:当前物品放与不放----当前物品放入大小为j的背包价值多少-----dp[j] = max(不放入当前物品的价值 dp[j], 放入当前物品的价值(腾出当前物品重量的空间) dp[j - weight[i]] + value[i])

为什么物品重量不需要排序:

  • 如果当前物品放进去导致上上个物品放不进去,而上个物品能放进去,不就刚好等于背包重量==上个物品重量的时刻
  • 最优解问题:不放入当前物品:价值为 dp[j](即前 i-1 个物品在容量 j 下的最优解)。

相等子序列

如果当前取出来的这个序列的值刚好等于总和的一半,那就说明剩下的序列肯定也是总和的一半,返回true

你可能感兴趣的:(算法,笔记,算法,c++)