<1>贪心算法
一、基本定义
贪心算法或者贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使得得到的结果是全局最优的。
二、基本要素
最优子结构性质和贪心选择性质
PS;最优子结构:
当一个问题的优化解包含了子问题的优化解时,这个问题具有优化子结构。
缩小子问题集合,只需那些优化问题中包含的子问题,降低实现复杂性。
优化子结构使得我们能自下向上地完成求解过程
三、基本思路
1.建立数学模型
2.把需要求解的问题分成多个子问题
3.对每一个字问题求解,得到子问题的局部最优解
4.把子问题的局部最优解合成原来问题的一个最优解
<2> 动态规划
一、基本定义
整体的最优解可以通过一系列最优解来达到,每次做出的选择可以以来之前的选择,但是不依赖后续的选择
二、基本要素
最优子结构性质和重叠子问题性质
PS:重叠子问题:
在问题的求解过程中,很多子问题的解将被多次使用
三、基本思想
1.把原始问题划分为一系列子问题
2.求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时到时直接存取,不重复计算,节省计算时间
3.自底向上地计算
<3>区别与联系
联系:
动态规划与贪心算法类似,都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。
区别:
贪心法选择当前最优解,而动态规划通过求解局部子问题的最优解来达到全局最优解。
<4>典型例题
01背包问题
题目:有N件物品和一个容量为V的背包。第i件物品的费用是weight[i],价值是value[i]。每件物品可以无限选用,求将哪些物品装入背包可使价值总和最大。
分析:01背包问题的意思是每种物品仅有一件,放则为“1”,不放则为“0”.我们可以将问题简化为“将前 (i-1)件物品放入容量为V的背包中,总价值为f[n-1] [v]
”,如果放第i件物品,问题为前i-1件物品放入剩下的容量为V-weight[i]
的背包中,价值为f[i-1][V-weight[i]]+value[i]
核心代码如下
for (int i=1; i<=N; i++)
for (int j=1; j<=M; j++)
{
if (weight[i]<=j)
{
f[i][j]=max(f[i-1][j],f[i-1][j-weight[i]]+value[i]);
}
else
f[i][j]=f[i-1][j];
}
本篇博客学习自B站@万诺coding@秒懂算法