动态规划(钢条切割问题 Java/Python/Golang)

2023-10-28

问题描述(引用算法导论描述):给定一段长度为n英寸的钢条(一个整型)和一个价格表p(一个数组)求钢条最优切割方案,使得销售的收益最大,如果n英寸的钢条的价格p[n]足够大,那么钢条有可能不需要切割

Java版本

原始版:

//原始求解方法
    /**
     * 
     * @param p 价格数组
     * @param n 钢条长度
     * @return 最优的价格
     */
    public int primaryCut(int[] p,int n){
        if(n == 0){
            return 0;
        }
        int q = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            q = Math.max(q,p[i] + primaryCut(p,n-i));
        }

        return q;
    }
 //备忘录求解方法
    //使用散列表记录整个备忘录
    public int memoryCut(int[] p,int n){
        int[] memory = new int[n+1];

        for (int i = 0; i < memory.length; i++) {
            memory[i] = Integer.MIN_VALUE;
        }


        
        return memoryCutAux(p,n,memory);
    }

    public int memoryCutAux(int[] p,int n,int[] memory){
        if (memory[n]  > 0){
            return memory[n];
        }
        if(n == 0){
            return 0;
        }

        int q = Integer.MIN_VALUE;

        for (int i = 1; i <= n; i++) {
            q = Math.max(q,p[i] + memoryCutAux(p,n-i,memory));
        }

        memory[n] = q;

        return memory[n];
    }
//自底向上方法求解
    public int BottomUpmemoryCut(int[] p,int n){
        int[] r = new int[n+1];
        r[0] = 0;
        for (int i = 1; i <= n; i++) {
            int q = Integer.MIN_VALUE;
            for (int j = 1; j <= i; j++) {
                q = Math.max(q,p[j] + r[i-j]);
            }
            r[i] = q;
        }
        return r[n];
    }

Python版本:

#原始求解方法
def primary_cut(p,n):
    if n == 0:
        return 0;
    
    q = -10000
    for i in range(1,n+1):
        q = max(q,p[i] + primary_cut(p,n-i))
    
    return q
#记忆数组求解方法
def memory_cut(p,n):
    
    r = [-1 for i in range(n+1)]    
    return memory_cut_aux(p,n,r)

def memory_cut_aux(p,n,r):
    if r[n] > 0 :
        return r[n]
    if n == 0:
        return 0
    else :
        q = -1
        for i in range(1,n+1):
            q = max(q,p[i] + memory_cut_aux(p,n-i,r))
        r[n] = q
    return r[n]
#自底向上求解方法
def buttom_up_memory_cut(p,n):
    r = [-1 for i in range(n+1)]

    r[0] = 0
    
    for i in range(1,n+1):
        q = -1
        for j in range(1,i+1):
            q = max(q,p[j] +r[i - j])
        r[i] = q
    return r[n]

Golang版本:

//primary
func primaryCut(p []int, n int) int {
	if n == 0 {
		return 0
	}
	q := -1

	for i := 1; i <= n; i++ {
		q = max(q, p[i]+primaryCut(p, n-i))
	}
	return q
}
//记忆数组
func memoryCut(p []int, n int) int {
	r := []int{}
	for i := 0; i <= n; i++ {
		r = append(r, -1)
	}
	return memoryCutAux(p, n, r)
}

func memoryCutAux(p []int, n int, r []int) int {
	if r[n] > 0 {
		return r[n]
	}
	if n == 0 {
		return 0
	}
	q := -1

	for i := 1; i <= n; i++ {
		q = max(q, p[i]+memoryCutAux(p, n-i, r))
	}
	r[n] = q
	return r[n]
}

//自底向下
func bottomUpMemory(p []int, n int) int {
	r := []int{}
	for i := 0; i <= n; i++ {
		r = append(r, -1)
	}
	r[0] = 0

	for i := 1; i <= n; i++ {
		q := -1
		for j := 1; j <= i; j++ {
			q = max(q, p[j]+r[i-j])
		}
		r[i] = q
	}
	return r[n]
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划(钢条切割问题 Java/Python/Golang) 的相关文章

随机推荐

  • 学习笔记 JavaScript ES6 箭头函数

    学习内容 this指向定义时所在的对象 而不是调用时所在的对象 不可以当作构造函数 不可以使用arguments对象 1 this指向定义时所在的对象 而不是调用时所在的对象 先来回顾一下ES5当中如何定义函数 function sum x
  • SQL Server是什么?SQL Server详细介绍

    一 SQL Server数据库简介 SQL Server数据库是Microsoft开发设计的一个关系数据库智能管理系统 RDBMS 现在是全世界主流数据库之一 SQL Server数据库具备方便使用 可伸缩性好 相关软件集成程度高等优势 能
  • centos7修改服务器密码忘记,Centos7忘记root密码怎么修改

    Centos7忘记root密码怎么修改 一 reboot重启机器 当出现引导界面时 按e进入内核编辑界面 二 往下翻 到LANG zh CN UTF 8后面添加 rd break 别忘了空格 三 修改完成后 按下Ctrl X组合键来运行这个
  • gcc,pkg-config,libyaml and etc..

    order of lib imports in gcc lib are importants the order of lib imports in gcc lib are importants I used to have this co
  • Java并发编程实战——你真的了解final吗?

    文章目录 final的简介 平时使用的final final修饰变量 final修饰方法 final修饰类 多线程中你真的了解final吗 final域基本数据类型的重排序规则 写final域的重排序规则 读final域的重排序规则 fin
  • AV1:为互联网提供开放、免费的视频编解码工具

    从学术研究到进入工业界 Zoe Liu一直在算法和音视频领域 目前在谷歌编解码团队为编解码器AV1做开发支持 Zoe畅谈了评定编解码器的标准 以及AV1的最新进度 本文是 下一代编码器 系列采访之一 欢迎自荐或推荐技术人加入 下一代编码器
  • 每日一题【day2】

    题目链接 思路 对于两门课之间的约束关系 很容易联想到图 我们可以将课抽象为节点 将约束抽象为一条有向边 可以用有向图的相关算法解决问题 拓扑排序正好可以解决这一问题 算法 拓扑排序 一个合法的选课序列就是一个拓扑序 拓扑序是指一个满足有向
  • 【交点】直线与多边形相交显示

    every blog every motto You can do more than you think https blog csdn net weixin 39190382 type blog 0 前言 python 求直线与多边形交
  • nio和bio的原理_NIO、BIO、AIO的区别,及NIO的应用和框架选型

    AIO BIO NIO的区别 IO模型主要分类 同步 synchronous IO和异步 asynchronous IO 阻塞 blocking IO和非阻塞 non blocking IO 同步阻塞 blocking IO 简称BIO 同
  • 算法库-二分查找操作

    文章目录 lower bound 返回指向第一个不小于给定值的元素的迭代器 gt x upper bound 返回指向第一个大于给定值的元素的迭代器 gt x binary search 确定元素是否存在于某范围中 equal range
  • PLC的优势与特点

    1 高可靠性 所有I O接口电路均采用光电隔离 将工业现场外部电路与plc内部电路电气隔离 各输入采用R C滤波器 其滤波时间常数一般为10 20 ms 各模块采用屏蔽措施 防止辐射干扰 采用性能优异的开关电源 严格筛选采用的设备 良好的自
  • java 中this的条件_在Java中,this用来代表( )的对象。_学小易找答案...

    填空题 Java语言中常用异常类IOException是用来处理 异常的类 单选题 下面关于继承的说法中正确的是 简答题 根据微课视频 制作函数 制作函数微课 wmv 填空题 Java发生异常状况的程序代码放在 语句块中 将要处理异常状况的
  • 对C++学习的反思(2023年5月23日)

    2023年5月23日 周二下午 存在的问题 至今仍然没用过C 的类来写项目 也不知道如何用C 的类来写项目 依然在用面向过程那套来写项目 不知道什么是面向对象编程 不知道为什么会有面向对象编程 不知道面向对象编程和面向过程相比有什么优势 那
  • rancher高可用安装

    kubernetes安装高可用rancher 需要安装helm 很简单自行安装即可 helm版本要求 本文使用的是已有的https证书 TLS证书 也可以用自建的 开始安装 一 添加helm rancher的仓库 请将命令中的
  • STM32F103的低功耗模式

    一 原理 STM32F103的低功耗模式有多种 常用的有STOP模式和STANDBY模式 这两种模式都可以有效降低芯片的功耗 特别是在电池供电的场景下 可以延长电池寿命 STOP模式 主要关闭CPU SRAM和Flash时钟 只保留少数必要
  • STM32一键下载电路程序下载后不运行问题分析

    使用STM32常用的下载方法主要有以下几种 1 ISP程序下载 使用STM32的串口1进行程序下载 使用该方式下载需要使用USB转串口芯片 常用的芯片如CH340G 该方式的程序下载需要使用上位机FlyMcu 上位机的设置出错很容易导致程序
  • mac 系统下通过docker 运行mysql

    mac 系统下通过docker 运行mysql 创建网络 mysql 安装 执行相关代码 配置参数 workspace docker mysql conf my cnf 启动 创建网络 docker network create dev n
  • Error creating bean with name ‘dataSource‘ Cannot load driver class: com.mysql.cj.jdbc.Driver

    最近写代码碰到一个关于jdbcTemplate的相关问题 因为项目的需求所以需要将程序打包成jar包去公司内网堡垒机运行 一直碰到一个与jdbcTemplate相关的问题 最后这个问题归结到 org springframework bean
  • 怎样制作网页

    制作网页可以通过以下步骤来完成 首先 你需要学习 HTML HyperText Markup Language 和 CSS Cascading Style Sheets 这两种编程语言 HTML 用来描述网页的结构和内容 CSS 用来控制网
  • 动态规划(钢条切割问题 Java/Python/Golang)

    问题描述 引用算法导论描述 给定一段长度为n英寸的钢条 一个整型 和一个价格表p 一个数组 求钢条最优切割方案 使得销售的收益最大 如果n英寸的钢条的价格p n 足够大 那么钢条有可能不需要切割 Java版本 原始版 原始求解方法 para