算法导论:钢条切割问题方法全解(递归+动态规划)

2023-11-01

public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        int[] p = {0,1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
//        System.out.println(main.CUT_ROD(p, 5));
//        System.out.println(main.MEMORIZED_CUT_ROD(p, 5));
//        System.out.println(main.BOTTOM_UP_CUT_ROD(p, 5));
        main.PRINT_CUT_ROD_SOLUTION(p,5);
    }

    //钢条切割问题:
//    自顶向下递归实现
    public int CUT_ROD(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] + CUT_ROD(p, n - i));
        }
        return q;
    }

    //    加入备忘机制的自顶向下递归实现
    public int MEMORIZED_CUT_ROD(int p[], int n) {
        int[] r = new int[n + 1];
        for (int i = 0; i <= n; i++) {
            r[i] = Integer.MIN_VALUE;
        }
        return MEMORIZED_CUT_ROD_AUX(p, n, r);
    }
    public int MEMORIZED_CUT_ROD_AUX(int p[], int n,int r[]) {
        if (r[n]>=0) return r[n];
        if (n == 0) return 0;
        int q = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            q = Math.max(q, p[i] + CUT_ROD(p, n - i));
        }
        return q;
    }

    //  自底向上的循环实现
    public int BOTTOM_UP_CUT_ROD(int[] p, int n) {
        int[] r = new int[n + 1];
        int q = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= i; j++) {
                q = Math.max(q, r[j] + p[i - j]);
            }
            r[i] = q;
        }
        return q;
    }

    //    记录第一段钢条的切割长度
    class PROFIT_LENGTH{
        int profit[];
        int length[];
        public PROFIT_LENGTH(int c[], int s[]) {
            this.length = s;
            this.profit = c;
        }
    }
    public void PRINT_CUT_ROD_SOLUTION(int[] p, int n) {
        PROFIT_LENGTH res = EXTENDED_BOTTOM_UP_CUT_ROD(p, n);
        while (n > 0) {
            System.out.println(res.length[n]+" "+res.profit[n]);
            n = n - res.length[n];
        }
    }
    public PROFIT_LENGTH EXTENDED_BOTTOM_UP_CUT_ROD(int[] p, int n) {
        int[] r = new int[n + 1];
        int[] s = new int[n + 1];
        int q = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= i; j++) {
                if (q < r[j] + p[i - j]) {
                    q = r[j] + p[i - j];
                    r[i] = q;
                    s[i] = j==0?i:j;
                }
            }
        }
        return new PROFIT_LENGTH(r,s);
    }

    //15.1-3考虑成本cost
    public int BOTTOM_UP_CUT_ROD_COST(int[] p, int n,int cost) {
        int[] r = new int[n + 1];
        int q = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= i; j++) {
                int curr = q == 0 ? r[j] + p[i - j] : r[j] + p[i - j] + cost;
                if (q < curr) {
                    q = curr;
                    r[i] = q;
                }
            }
        }
        return q;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法导论:钢条切割问题方法全解(递归+动态规划) 的相关文章

  • 如何使用Spring WebClient进行同步调用?

    Spring Framework in 休息模板 https docs spring io spring framework docs current javadoc api org springframework web client R
  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • Guice 忽略注入构造函数参数上的 @Nullable

    我正在使用 Guice v 3 0 并且有一个值被注入到构造函数中 该值可以为 null 因此我在构造函数中使用 Nullable 来自 javax annotations 注释了该参数 public MyClass Parameter1
  • 带有 Android 支持库 v7 的 Maven Android 插件

    我使用 maven android plugin 构建我的 android 应用程序 它依赖于 android 支持库 v4 和 v7 由于我没有找到如何从developer android com下载整个sdk 因此我无法使用maven
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • Spring Data JPA:查询如何返回非实体对象或对象列表?

    我在我的项目中使用 Spring Data JPA 我正在演奏数百万张唱片 我有一个要求 我必须获取各种表的数据并构建一个对象 然后将其绘制在 UI 上 现在如何实现我的 Spring 数据存储库 我读到它可以通过命名本机查询来实现 如果指
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • conda添加清华镜像源

    Anaconda 是一个用于科学计算的 Python 发行版 支持 Linux Mac Windows 包含了众多流行的科学计算 数据分析的 Python 包 Anaconda 安装包可以到 清华镜像源下载anaconda 下载 TUNA
  • 异步赠书:10月Python畅销书升级

    2018年最新活动 免费赠书 1 关注微信号 异步图书 2 邀请10位好友关注10天后 填写下方表单登记信息 即可免费获得异步图书一本 异步社区选书网址 www epubit com 点击登记免费图书邮寄信息 活动已结束 最新活动地址 ht
  • LeetCode 1689. 十-二进制数的最少数目

    如果一个十进制数字不含任何前导零 且每一位上的数字不是 0 就是 1 那么该数字就是一个 十 二进制数 例如 101 和 1100 都是 十 二进制数 而 112 和 3001 不是 给你一个表示十进制整数的字符串 n 返回和为 n 的 十
  • idea 通过访问路径快速定位到Controller方法

    目录 问题原因 解决方案 RestfulToolkit插件 使用方式 windows MAC 扩展 效果展示 问题原因 我们在调试 或者某个接口出现bug首先知道和拿到的一般是接口路径 系统运行久了 模块会很多 接口也会很多 找起来很麻烦
  • Strus2+Spring整合笔记

    1 拷贝Struts2 jar包和Spring jar包到 WEB INF lib目录下 2 配置Strust2核心控制器 配置文件 3 为第三步的Spring提供配置文件 4 添加Struts2 Spring整合的插件包 5 在appCt
  • 虚拟IP是什么?

    要是单讲解虚拟 IP 理解起来很困难 所以干脆把 动态 IP 固定 IP 实体 IP 与虚拟 IP都讲解一下 加深理解和知识扩展 实体 IP 在网络的世界里 为了要辨识每一部计算机的位置 因此有了计算机 IP 位址的定义 一个 IP 就好似
  • 2023-5-16第十六天

    permanent永久的 temporary instruction教授 传授 impart教授 initiate教授 接纳 reside居住于 resident居民 recover恢复 找回 laternate交替的 轮流的 interp
  • 小米官网项目制作——javascript知识分享上

    目录 前言 一 整体架构 二 弹出的盒子 1 定位盒子 2 弹出效果 3 其他细节 三 下拉 展开的切换菜单 1 放置盒子 2 切换盒子 3 添加索引 4 侧边展开的盒子 四 轮播图 1 本体的部件 2 轮播图 3 节流阀 4 其他的细节
  • Docker搭建Seata环境

    Docker搭建Seata环境 添加seata需要的数据库表 直接点击 mysql数据库 oracle数据库 postgresql数据库 为业务数据库也添加一个undo log表 Seata的AT模式下之所以在第一阶段直接提交事务 依赖的是
  • scikit keras_使用Scikit-Learn,Scikit-Opt和Keras进行超参数优化

    scikit keras Hyperparameter optimization is often one of the final steps in a data science project Once you have a short
  • Redis第十四讲 Redis是单线程还是多线程以及Redis保持高性能的原因

    Redis是单线程还是多线程 redis 4 0 之前 redis 是完全单线程的 redis 4 0 时 redis 引入了多线程 但是额外的线程只是用于后台处理 例如 删除对象 核心流程还是完全单线程的 这也是为什么有些人说 4 0 是
  • 【CTF知识库】常见安全设备默认口令清单

    设备 默认账号 默认密码 地址 深信服产品 sangfor sangfor sangfor 2018 sangfor 2019 无 深信服科技 AD dlanrecover https wenku baidu com view d49d55
  • UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x82 in position 193: illegal multibyte sequence

    终端命令行运行python出错 UnicodeDecodeError gbk codec can t decode byte 0x82 in position 193 illegal multibyte sequence 解决方法 参考博客
  • 【编译原理】FIRST集合和FOLLOW集合

    FIRST集合 定义 可从 推导得到的串的首符号的集合 其中 是任意的文法符号串 规则 计算文法符号 X 的 FIRST X 不断运用以下规则直到没有新终结符号或 可以被加入为止 1 如果 X 是一个终结符号 那么 FIRST X X 2
  • unity各种特效shader效果资源以及位置

    录制自己的视频或者写博客 实时更新 学习unity资源商店的Demo 多在资源商店逛逛很重要 shader必须学 shader的基础是3D图形学 unityTextMeshPro中文字体制作 https blog csdn net qq 3
  • 全志A13折腾备忘

    启动过程 uboot with spl gt kernel gt os 其实主要是uboot with spl这一块 根据OLinuXino的说法 uboot分为两类 sunxi uboot mainline uboot 分别是全志和ubo
  • POJ 1240 Pre Post erous

    给定一颗k叉树的前序和后序遍历序列 求这个k叉树一共可能有多少种 求每个节点孩子节点的个数n 然后从m个位置中选n个位置给这n个孩子 一共有c m n 中选法 把所有节点的这个值相乘即可 include
  • vue中template的三种写法

    第一种 字符串模板写法 直接写在vue构造器里 这种写法比较直观 适用于html代码不多的场景 但是如果模板里html代码太多 不便于维护 不建议这么写 第二种 直接写在template标签里 这种写法跟写html很像 第三种 写在scri
  • Mybatis的代码自动生成插件(Free Mybatis plugin)

    介绍 使用的是Free Mybatis plugin代码生成插件 在idea的plugins中可以搜索到 并且是免费的 唯一的不足就是 代码如果重新生成 会被覆盖掉 所以需要手动的进行合并源代码 不过通过git可以比较好的解决该问题 安装
  • 算法导论:钢条切割问题方法全解(递归+动态规划)

    public class Main public static void main String args Main main new Main int p 0 1 5 8 9 10 17 17 20 24 30 System out pr