剑指offer刷题记录11--剪绳子(动态规划,贪心算法)

该系列博客内容主要是《剑指Offer》中的经典题目,结合在刷题过程中见到的一些精彩的解题过程,从而在这里记录下来。代码以Python3实现。真的是搞算法搞得头秃,在这里卡了比较久的时间,尽我可能的去写好这篇博客。
在这里插入图片描述
解法1 贪心思路求解
什么是贪心算法呢?
贪婪算法的 Wikipedia 定义:是一种在每一步选中都采取在当前状态下最好或最优的选择,从而希望导致结果是最好或最优的算法。
优点:对于一些问题,非常直观有效。
缺点:并不是所有问题都能用它去解决,此外,得到的结果并不一定不是正确的,因为这种算法容易过早地做出决定,从而没有办法达到最优解。

下面通过例题来加深对贪婪算法的认识。例题:0-1 背包问题,能不能运用贪婪算法去解决。
有三种策略:
1、选取价值最大的物品
2、选择重量最轻的物品
3、选取价值/重量比值最大的物品

策略 1:每次尽可能选择价值最大的,行不通。举例说明如下。
物品有:A B C
重量分别是:25, 10, 10
价值分别是:100,80,80
根据策略,首先选取物品 A,接下来就不能再去选其他物品,但是,如果选取 B 和 C,结果会更好。

策略 2:每次尽可能选择轻的物品,行不通。举例说明如下。
物品有:A B C
重量分别为:25, 10, 10
价值分别为:100, 5, 5
根据策略,首先选取物品 B 和 C,接下来就不能选 A,但是,如果选 A,价值更大。

策略 3:每次尽可能选价值/重量比最大的,行不通。举例说明如下。
物品有:A B C
重量是:25, 10, 10
价值是:25, 10, 10
根据策略,三种物品的价值/重量比都是一样,如果选 A,答案不对,应该选 B 和 C。

由上,贪婪算法总是做出在当前看来是最好的选择。即,它不从整体的角度去考虑,仅仅对局部的最优解感兴趣。因此,只有当那些局部最优策略能产生全局最优策略的时候,才能用贪婪算法。

回过头来看这道题,若我们每次在剪绳子的时候都选择当前最优,那我们就应该考虑,每次动剪刀的时候保证当前乘积最大。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这种解法很需要数学功底进行推导!

解法2:暴力递归
在这里插入图片描述
在这里插入图片描述
解法3:动态递归(自底向上)
在这里插入图片描述代码如下
在这里插入图片描述
复杂度分析
时间复杂度:O(N^2)。
空间复杂度:O(N)。

参考链接1
参考链接2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值