动态规划之钢筋切割问题

目录

一 问题描述
二 原理
三 代码
四 输出结果


一 问题描述

注 : 资料来源于《算法导论》第15章动态规划.


二 原理















三 代码

自顶向下解法


/**
 * 
 * 采用自顶向下解法
 * 
 * **/
public class CuttingSteel {
	
	private static int[] r = new int[11];//最大收益备忘录
	private static int[] p = new int[11]; //定义价格

	/**
	 * 切割钢筋备忘录
	 * int[] p 官方定义的价格
	 * int n 表示n节长的钢筋
	 * **/
	public  int MEMOIZEDP_CUT_ROD(int n){
		r = new int[n+1];
		p = new int[n+1];
		/**
		 * 初始化 int[] p
		 * 长度	=	0	1	2	3	4	5	6	7	8	9	10
		 * 价格	=	0	1	5	8	9	10	17	17	20	24	30
		 * **/
		if(n<11) p = new int[11];
		p[0]=0;p[1]=1;p[2]=5;p[3]=8;p[4]=9;p[5]=10;
		p[6]=17;p[7]=17;p[8]=20;p[9]=24;p[10]=30;
		
		/**
		 * 初始化 int[] 
		 * **/
		for(int i = 0 ; i < r.length ; i++){
			r[i] = -1;
		}
		return MEMOIZED_CUT_ROD_AUX(p,n,r);
	}
	
	/**
	 * 获取切割钢筋最大收益
	 * 参数说明:
	 * int[] p 官方定义价格
	 * int n 当前钢筋节数
	 * int r[] 最大收益备忘录
	 * **/
	private int MEMOIZED_CUT_ROD_AUX(int[] p,int n,int r[]){
		int q = -1; //最大值
		if(r[n]>=0) return r[n];
		if(n==0){
			q = 0;
		}else if(q==-1){
			for(int i = 1 ; i <= n ; i++){
				q=max(q,p[i]+MEMOIZED_CUT_ROD_AUX(p,n-i,r));
			}
		}
		r[n] = q; //缓存最大收益
		return q;
	}
	
	/**
	 * 返回两个数中最大的值
	 * **/
	private int max(int a,int b){
		if(a > b) return a;
		return b;
	}
	
	public static void main(String[] args) {
		CuttingSteel cuttingSteel = new CuttingSteel();
		for(int i = 0 ; i <= 50 ; i++){
			int maxProfit =  cuttingSteel.MEMOIZEDP_CUT_ROD(i);
			System.out.println(i+"节钢筋的最大利益为 : " + maxProfit);
		}

	}

}



四 输出结果

0节钢筋的最大利益为 : 0
1节钢筋的最大利益为 : 1
2节钢筋的最大利益为 : 5
3节钢筋的最大利益为 : 8
4节钢筋的最大利益为 : 10
5节钢筋的最大利益为 : 13
6节钢筋的最大利益为 : 17
7节钢筋的最大利益为 : 18
8节钢筋的最大利益为 : 22
9节钢筋的最大利益为 : 25
10节钢筋的最大利益为 : 30
11节钢筋的最大利益为 : 31
12节钢筋的最大利益为 : 35
13节钢筋的最大利益为 : 38
14节钢筋的最大利益为 : 40
15节钢筋的最大利益为 : 43
16节钢筋的最大利益为 : 47
17节钢筋的最大利益为 : 48
18节钢筋的最大利益为 : 52
19节钢筋的最大利益为 : 55
20节钢筋的最大利益为 : 60
21节钢筋的最大利益为 : 61
22节钢筋的最大利益为 : 65
23节钢筋的最大利益为 : 68
24节钢筋的最大利益为 : 70
25节钢筋的最大利益为 : 73
26节钢筋的最大利益为 : 77
27节钢筋的最大利益为 : 78
28节钢筋的最大利益为 : 82
29节钢筋的最大利益为 : 85
30节钢筋的最大利益为 : 90
31节钢筋的最大利益为 : 91
32节钢筋的最大利益为 : 95
33节钢筋的最大利益为 : 98
34节钢筋的最大利益为 : 100
35节钢筋的最大利益为 : 103
36节钢筋的最大利益为 : 107
37节钢筋的最大利益为 : 108
38节钢筋的最大利益为 : 112
39节钢筋的最大利益为 : 115
40节钢筋的最大利益为 : 120
41节钢筋的最大利益为 : 121
42节钢筋的最大利益为 : 125
43节钢筋的最大利益为 : 128
44节钢筋的最大利益为 : 130
45节钢筋的最大利益为 : 133
46节钢筋的最大利益为 : 137
47节钢筋的最大利益为 : 138
48节钢筋的最大利益为 : 142
49节钢筋的最大利益为 : 145
50节钢筋的最大利益为 : 150



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值