【算法导论学习-27】动态规划经典问题01:钢条切割的最大收益
来源:互联网 发布:json 美化 站长工具 编辑:程序博客网 时间:2024/05/16 18:51
参考:《算法导论》P360页15.1 Rod cutting
问题描述:给出下面一个钢条的长度(int类型)和对应的价格表,求出给定长度n米(int类型)的钢条如何切割才能获得最大收益。
长度(m)
1
2
3
4
5
6
7
8
9
10
……
n
价格($)
1
5
8
9
10
17
17
20
24
30
p
【分析】:自顶向上分析,p[i]表示长i米的单价,长度为n米的钢条的最大收益是r[n],r[0]=0。则状态递归方程为:r[n]=max[(p[1]+r[n-1]),(p[2]+r[n-2]), (p[3]+r[n-3])…, (p[n]+r[n-n])],即r[n]=max(p[i]+r[n-1])),1≤i≤n。
自底向上分析,r[1]=p[1] =1,r[2]=max[(p[1]+r[1]),(p[2]+r[0])]=max(2,5)=5,r[3]=max[(p[1]+r[2]),(p[2]+r[1]), (p[3]+r[0])]=max(6,5,8)=8,……。只要自底向上记录r[n]即可。参考《算法导论》P369页伪代码,java实现如下:
/** * @author曹艳丰 北京大学 * 类说明:动态规划解决钢条切割问题 */public classRodCutting { /** * @param args */ public static void main(String[] args) { // TODO自动生成的方法存根 int[] p={0,1,5,8,9,10,17,17,20,24,30}; printCutRodSolution(p, 2); } /*自底向上方式进行动态规划*/ public static Object []extendedBottomUpCutRod(int[] p,int n) { int cost=0; int[] r=new int[n+1];//r[j]记录的是长度为j的时候的最大收益 int[] s=new int[n+1];//s[j]记录的是长度为j获得最大收益的时候做半截切割的长度 r[0]=0; for (int j = 1; j <=n; j++) { int q=Integer.MIN_VALUE; /*只有當i=j的時候表示本次不需要切割,否則需要切割*/ for (int i = 1; i <=j; i++) { if (i<j&&q<p[i]+r[j-i]-cost) { q=p[i]+r[j-i]-cost; s[j]=i; }else if (q<p[j]) { q=p[j]; s[j]=j; } } r[j]=q; } Object[]objects={r,s}; return objects; } /*输出最大收益和切割方式*/ private static void printCutRodSolution(int[] p,int n) { Object[]objects=extendedBottomUpCutRod(p, n); int[] r=(int[]) objects[0]; System.out.println("最大收益"+r[n]); int[] s=(int[]) objects[1]; System.out.println("切割方式:"); while (n>0) { System.out.println(s[n]); n=n-s[n]; } }}
**********************************************************************
《算法导论》P370课后题15.1.3要求加入条件——每次切割有个固定的代价cost。我这里已经加了个cost,等于0。可以修改cost值查看切割结果。
0 0
- 【算法导论学习-27】动态规划经典问题01:钢条切割的最大收益
- 《算法导论》动态规划钢条切割问题
- 算法导论笔记 动态规划 -- 钢条切割问题 思路
- 算法导论 - 动态规划 - 钢条切割
- 算法导论---------动态规划之钢条切割
- 算法导论--动态规划(钢条切割)
- 动态规划-钢条切割《算法导论》
- 算法导论 动态规划之钢条切割
- 算法导论之动态规划:钢条切割
- 钢条切割--动态规划--算法导论
- 算法导论-动态规划-钢条切割
- 钢条切割获得最大收益(动态规划)
- 算法导论 动态规划 钢条切割问题的自底向上解法
- [算法学习笔记]动态规划之钢条切割问题
- 【算法设计-动态规划】钢条切割问题
- 算法导论--第15章 动态规划--钢条切割
- 算法导论15章 动态规划 之 钢条切割
- 算法导论系列文章之动态规划-钢条切割
- 黑马程序员——流程控制语句
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析
- Zabbix如何监控Windows机器
- Prefab动态修改无效的解决方案
- sprintf,你知道多少?
- 【算法导论学习-27】动态规划经典问题01:钢条切割的最大收益
- 在Jenkins上用Ant 编译android程序并在真机上运行
- linux实时时钟驱动一之API编程接口
- C++ 11 新特性集合
- __attribute__知多少?
- poj 3268 (最短路 spfa)
- php URL加密、解密
- 数据库范式简要介绍
- C语言面试题