来自浙江理工大学在读研究生Yuner:
github地址
个人博客地址
此问题dp式 :rn = max(pi + r(n-1))
不使用dp,用普通的递归方式来求解
//使用普通的方法来计算钢条切割的最优切割方案
public class Steelbarcutting1 {
private int[] price;
Steelbarcutting1() {
price = new int[]{1,5,8,9,10,17,17,20,24,30};
}
private int cut_rod(int n){
int q = 0;
if(n == 0)
return 0;
for(int i = 1; i <= n; i++) {
q = Math.max(q,price[i - 1] + cut_rod(n - i));
}
return q;
}
public static void main(String[] args) {
Steelbarcutting1 steelbarcutting1 = new Steelbarcutting1();
System.out.println(steelbarcutting1.cut_rod(9));
}
}
使用自顶向下的递归实现
//使用动态规划的方式切割钢条
//自顶向下的动态规划
public class Steelbarcutting2 {
private int[] price;
private int[] r;
Steelbarcutting2() {
price = new int[]{1,5,8,9,10,17,17,20,24,30};
r = new int[10];
}
private int cut_rod(int n) {
int q = 0;
if (r[n] > 0 )
return r[n];
if(n == 0) {
q = 0;
}
for(int i = 1; i <= n; i++) {
q = Math.max(q,price[i - 1] + cut_rod(n -i));
}
r[n]=q;
return q;
}
public static void main(String[] args) {
Steelbarcutting2 steelbarcutting2 = new Steelbarcutting2();
System.out.println(steelbarcutting2.cut_rod(7));
}
}
使用自低向上的版本
//自低向上的动态规划
public class Steelbarcutting3 {
private int[] price;
private int[] r;
Steelbarcutting3() {
price = new int[]{1,5,8,9,10,17,17,20,24,30};
r = new int[11];
}
private int cut_rod(int n) {
int q = 0;
r[0] = 0;
for(int j = 1; j <= n; j++) {
for(int i = 1; i <= j; i++) {
q = Math.max(q,price[i - 1] + r[j - i]);
}
r[j] = q;
}
return r[n];
}
public static void main(String[] args) {
Steelbarcutting3 steelbarcutting1 = new Steelbarcutting3();
System.out.println(steelbarcutting1.cut_rod(8));
}
}