贪心算法与动态规划

<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@秒懂算法

  • 1
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值