动态规划算法---钢条切割
算法进阶---动态规划算法
- 钢条切割问题:
- 程序实现:
钢条切割问题:
程序实现:
方法一和方法二是对程序实现的不断深入,逐渐降低算法实现的时间复杂度。
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 #include"stdafx.h" 2 #include<iostream> 3 using namespace std; 4 /* 5 动态规划算法: 6 1. ...
- 算法导论-动态规划(钢条切割问题)
写下文章来记录下自己学习算法导论的笔记 文章目录 写下文章来记录下自己学习算法导论的笔记 动态规划的目的 设计动态规划算法 钢条切割问题 问题描述 刻画问题结构(建立方程) 递归方程建立 带备忘录的自 ...
- 算法导论15.1动态规划之钢条切割
动态规划与钢条切割 1.分治算法与动态规划 相同点: 都是通过组合子问题的解来求解原问题 不同: 1.分治将问题划分为互不相交的子问题,递归地求解子问题,在将它们的解组合起来,求出原问题. 2.动态规 ...
- 《算法导论》中动态规划求解钢条切割问题
动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契 ...
- Python数据结构与算法-动态规划(钢条切割问题)
一.动态规划(DP)介绍 1.从斐波那契数列看动态规划 (1)问题 斐波那契数列递推式: 练习:使用递归和非递归的方法来求解斐波那契数列的第n项 (2)递归方法的代码实现 import time # ...
- 《算法导论》学习(十七)----动态规划之钢条切割(C语言)
文章目录 前言 一.钢条切割问题 1.问题背景 2.问题描述 3.问题的难点 (1)情况较多 (2)消除重复子问题 二.问题解决方案 1.问题的特点 (1)最优化子结构 (2)重复子问题 2.最优化解 ...
- 动态规划:钢条切割问题
一.题目 钢条切割问题 是<算法导论>一书中介绍动态规划时的一道引题.即: 某公司购买长钢条,将其切割为短钢条出售.假设切割工序没有成本支出,已知长度为 i 的钢条出售价格为 pi ,钢条 ...
- 数据结构(python) —— 【34: 动态规划之钢条切割问题】
钢条切割问题 1. 问题 某公司出售钢条,出售价格与钢条长度之间的关系如下表: 问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大. 2. 思路 思考: 长度为n的钢条的不同切 ...
- 【动态规划】钢条切割问题
本人在学习<算法导论>的过程中,对于动态规划这部分的内容不是特别理解,于是决定做一下学习与解决记录,欢迎讨论交流. 文章目录 0- 动态规划问题的一般步骤 1- 问题描述 2-问题分析 3 ...
最新文章
- 电子计算机说明文作文,电脑事物说明文
- 在WildFly中运行多个standalone模式的实例
- IBASE read buffer
- 图神经网络(一)图信号处理与图卷积神经网络(1)矩阵乘法的三种方式
- Yii 1.0 伪静态即Yii配置Url重写(转)
- 组装复杂json请求数据和解析复杂json数据
- vue路由vue-router的使用
- IDL | 实验六、ENVI波段运算与功能扩展
- Linux Mint---开启桌面三维特效
- 计算机控制系统中采样速率的选择
- 【每日新闻】Gartner:区块链热度高但实际部署较少且面临挑战 | 阿里巴巴宣布研制出全球最强量子电路模拟器“太章”...
- Random Forests预测森林植被类型
- 创业案例:如何调整股权,才不伤害合伙人感情?
- git ssh-keygen
- 用Jplayer做的一个带动画的播放器
- MyCms 自媒体 CMS 系统 v3.1.0,新增商城接口
- JQuery对象与JavaScript对象的区别与转换
- clobber和glob
- Echarts中tooltip显示的数据与数据本身顺序相反
- Navicat Premium汉化