算法导论——动态规划:钢条切割

算法导论——动态规划:钢条切割

package org.loda.dynamic; import org.junit.Test; /** * * @ClassName: RodCutting * @Description: 钢条切割 * * 动态规划问题 * * 给定一段长度为n英寸的钢条和一个价格表Pi,求切割钢条的方案,使得销售收益Rn最大 * * @author minjun * @date 2015年5月17日 下午12:54:46 * */ public class RodCutting { /** * 记录所有价格表 */ private int[] p={1,5,8,9,10,17,17,20,24,30}; //存储之前计算的最优价钱,初始值默认为0 private int[] r; //存储最优价钱时所切割的第一段的长度 private int[] s; @Test public void cutting(){ int n=8; long start=System.nanoTime(); cutting(n); System.out.println("长度为"+n+"英寸切割的最大收益为"+r[n]); System.out.println("切割的两段分别为:"+s[n]+","+(n-s[n])); long end=System.nanoTime(); System.out.println("时间消耗:"+(end-start)/1000000.0+"毫秒"); } private void cutting(int n) { r=new int[n+1]; s=new int[n+1]; //记录第一段切割长度为i时计算过程的数值 for(int i=1;i<=n;i++){ //假设第一段切割长度为i的最大收益为max,为它取个哨兵量的值,即为最小整数 int max=Integer.MIN_VALUE; //不断切割以尝试获取最大收益 for(int j=1;j<=i;j++){ //本次切割后收益更多,就取为本次切割的收益为最大收益,并将本次切割的第一段的长度设为最优切割长度 if(max<p[j-1]+r[i-j]){ max=p[j-1]+r[i-j]; s[i]=j; } } //完成所有的切割尝试之后,会统计出最优的切割方案所获取的收益,将该收益记录为长度n的最优收益 r[i]=max; } } }

输出结果为:

长度为8英寸切割的最大收益为22 切割的两段分别为:2,6 时间消耗:0.386708毫秒

转载于:https://my.oschina.net/u/1378920/blog/415989

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109450.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • leetcode-23合并K个升序链表(分治|堆)

    leetcode-23合并K个升序链表(分治|堆)给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:lists = []输

    2022年8月9日
    5
  • c++创建对话框_窗体边框改为对话框样式

    c++创建对话框_窗体边框改为对话框样式本例中涉及到对话框标题栏的自绘,双缓冲位图的显示以及位图按钮类的使用。

    2022年10月8日
    6
  • MFC 读取EXCEL中数据[通俗易懂]

    MFC 读取EXCEL中数据[通俗易懂]MFC读取Excel例子(2013-01-1200:04:24)转载▼标签:365mfcit分类:MFC-office操作1.       首先要将excel类添加到工程中。在ClassWizard中,【AddClass】,在Excel的安装目录找到Excel.exe(Microsoft2003是Excel

    2022年6月15日
    26
  • redis是单线程还是多线程,有哪些特点(linux多线程面试题)

    0.redis单线程问题单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。1.为什么说redis能够快速执行(1)绝大部分请求是纯粹的内存操作(非常快速)(2)采用单线程,避免了不必要的上下文切换和竞争条件(3)非阻塞IO-IO多路复用2.redis的内部实现 内部实现采用epoll,采用了epoll+自己…

    2022年4月15日
    40
  • pythonobject类_java中所有异常类的父类

    pythonobject类_java中所有异常类的父类Object类所有类的父类,默认所有的类都继承至Object类规定了类的结构,加载方式,常用函数以前的写法:class类名(Object):pass现在的写法:class类名:pass如果有父类才编写,如果没有父类可以省掉Object类,但是也是默认继承内置函数:__new__(cls,*args,**kwargs)创建对象时自动调用的函数,主要作用是创建对象,给该对象分配空间,方便之后的的操作该函数会返回创建…

    2025年7月15日
    5
  • 获取服务器IP地址

    获取服务器IP地址/***获取服务器IP地址*@return*/publicstaticStringgetServerIp(){StringSERVER_IP=null;try{Stri

    2022年7月3日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号