算法进阶---动态规划算法

  • 钢条切割问题:
  • 程序实现:

钢条切割问题:





程序实现:

方法一和方法二是对程序实现的不断深入,逐渐降低算法实现的时间复杂度。

p = [0, 1, 5, 8, 9, 10, 17, 17, 20, 21, 23, 24, 26, 27, 27, 28, 30, 33, 36, 39, 40]
# p = [0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30]
#方法一,两边都切割,重复了很多计算
#@cal_time
def cut_rod_recurision_1(p, n):if n == 0:return 0else:res = 0for i in (1, n):res = max(res, cut_rod_recurision_1(p, i) + cut_rod_recurision_1(p, n-i))return res
#方法二,左边不切割,只切割右边,减少了很多重复计算
def cut_rod_recurision_2(p, n):if n == 0:return 0else:res = 0for i in range(1, n+1):#此处是1到n+1,即i为1到nres = max(res, p[i] + cut_rod_recurision_1(p, n - i))return res
#方法一、二都是自顶向下的思想,先算r[10],r[10]为r[2]+r[8],然后r[2]和r[8]不断递归。

方法三,动态规划—自底向上,结果最优(所需时间最短)

p = [0, 1, 5, 8, 9, 10, 17, 17, 20, 21, 23, 24, 26, 27, 27, 28, 30, 33, 36, 39, 40]
# p = [0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30]#方法三,自底向上的思想,也就是动态规划的思想
def cut_rod_dp(p, n):r = [0]for i in range(1, n+1):res = 0for j in range(1, i+1):res = max(res, p[j] + cut_rod_dp(p, i-j))# res = max(res, p[j] + r[i-j])r.append(res)# r[i] = resreturn r[n]

算法完整程序:

p = [0, 1, 5, 8, 9, 10, 17, 17, 20, 21, 23, 24, 26, 27, 27, 28, 30, 33, 36, 39, 40]
# p = [0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30]#情况五、进阶返回切割好的情况
def cut_rod_extend(p, n):r = [0]s = [0]for i in range(1, n+1):res_r = 0 #表示价格的最大值res_s = 0 #价格最大值对应方案的左边不切割的长度for j in range(1, i+1):if res_r < p[j] + r[i-j]:res_r = p[j] + r[i-j]res_s = jr.append(res_r)s.append(res_s)return r[n],sdef cut_rod_solution(p, n):r,s = cut_rod_extend(p, n)ans = []while n > 0:ans.append(s[n])n -= s[n]return ansprint(cut_rod_solution(p,20))

动态规划算法---钢条切割相关推荐

  1. 动态规划算法 - 钢条切割问题

    1 #include"stdafx.h" 2 #include<iostream> 3 using namespace std; 4 /* 5 动态规划算法: 6 1. ...

  2. 算法导论-动态规划(钢条切割问题)

    写下文章来记录下自己学习算法导论的笔记 文章目录 写下文章来记录下自己学习算法导论的笔记 动态规划的目的 设计动态规划算法 钢条切割问题 问题描述 刻画问题结构(建立方程) 递归方程建立 带备忘录的自 ...

  3. 算法导论15.1动态规划之钢条切割

    动态规划与钢条切割 1.分治算法与动态规划 相同点: 都是通过组合子问题的解来求解原问题 不同: 1.分治将问题划分为互不相交的子问题,递归地求解子问题,在将它们的解组合起来,求出原问题. 2.动态规 ...

  4. 《算法导论》中动态规划求解钢条切割问题

    动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契 ...

  5. Python数据结构与算法-动态规划(钢条切割问题)

    一.动态规划(DP)介绍 1.从斐波那契数列看动态规划 (1)问题 斐波那契数列递推式: 练习:使用递归和非递归的方法来求解斐波那契数列的第n项 (2)递归方法的代码实现 import time # ...

  6. 《算法导论》学习(十七)----动态规划之钢条切割(C语言)

    文章目录 前言 一.钢条切割问题 1.问题背景 2.问题描述 3.问题的难点 (1)情况较多 (2)消除重复子问题 二.问题解决方案 1.问题的特点 (1)最优化子结构 (2)重复子问题 2.最优化解 ...

  7. 动态规划:钢条切割问题

    一.题目 钢条切割问题 是<算法导论>一书中介绍动态规划时的一道引题.即: 某公司购买长钢条,将其切割为短钢条出售.假设切割工序没有成本支出,已知长度为 i 的钢条出售价格为 pi ,钢条 ...

  8. 数据结构(python) —— 【34: 动态规划之钢条切割问题】

    钢条切割问题 1. 问题 某公司出售钢条,出售价格与钢条长度之间的关系如下表: 问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大. 2. 思路 思考: 长度为n的钢条的不同切 ...

  9. 【动态规划】钢条切割问题

    本人在学习<算法导论>的过程中,对于动态规划这部分的内容不是特别理解,于是决定做一下学习与解决记录,欢迎讨论交流. 文章目录 0- 动态规划问题的一般步骤 1- 问题描述 2-问题分析 3 ...

最新文章

  1. 电子计算机说明文作文,电脑事物说明文
  2. 在WildFly中运行多个standalone模式的实例
  3. IBASE read buffer
  4. 图神经网络(一)图信号处理与图卷积神经网络(1)矩阵乘法的三种方式
  5. Yii 1.0 伪静态即Yii配置Url重写(转)
  6. 组装复杂json请求数据和解析复杂json数据
  7. vue路由vue-router的使用
  8. IDL | 实验六、ENVI波段运算与功能扩展
  9. Linux Mint---开启桌面三维特效
  10. 计算机控制系统中采样速率的选择
  11. 【每日新闻】Gartner:区块链热度高但实际部署较少且面临挑战 | 阿里巴巴宣布研制出全球最强量子电路模拟器“太章”...
  12. Random Forests预测森林植被类型
  13. 创业案例:如何调整股权,才不伤害合伙人感情?
  14. git ssh-keygen
  15. 用Jplayer做的一个带动画的播放器
  16. MyCms 自媒体 CMS 系统 v3.1.0,新增商城接口
  17. JQuery对象与JavaScript对象的区别与转换
  18. clobber和glob
  19. Echarts中tooltip显示的数据与数据本身顺序相反
  20. Navicat Premium汉化

热门文章

  1. 基于Go语言Revel+Layui的OA办公系统
  2. python 成语接龙-连接数据库
  3. 企业工商信息查询第三方软件/API查询原理分析
  4. 三维重建(1):坐标系之间的变换
  5. 还可以这么玩:盘点iOS 11中Siri的12项新功能
  6. MogaFX—ServiceNow的Bill McDermott正在关注货币汇率
  7. 故宫夜景门票最高炒至9999元 官方:二手票难以入场
  8. 微信小程序observers数据监听器的使用
  9. 流程图软件lauto_流程图软件(Iauto)
  10. 涅普2021训练营-MIsc(部分)