目录
一 问题描述
二 原理
三 代码
四 输出结果
一 问题描述
注 : 资料来源于《算法导论》第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