问题:钢条切割
给定长度为n英寸的钢条,和一个价格表P{1....n},求切割钢条的方案,使得收益R最大。如果钢条价格足够大,可以完全不用切割。
来源:算法导论,第15章
方法:1、递归穷举;2、动态规划
思路:
递归穷举:钢条分为两部分左边为不切割部分范围长度j,右边为切割部分范围n-j,收益Max{R = P[j]+R[n-j]}
private static int findCutRod(int[]p,int n) {
if(n==0){
return 0;
}
int q=Integer.MIN_VALUE;
for(int j=1;j<=n;j++){
q =Math.max(q, p[j-1]+findCutRod(p, n-j));
}
return q;
}
缺点:当n增加,运行时间会爆炸式增长(画个递归树,非常明白就看出来了),原因是,重复的计算了很多次
优点:不需要借助额外的空间
动态规划:思路与递归相同,
不同的是:创建一个数组保存已经计算过的切割次数对应的收益,直接查表,避免重复计算
下面是自顶向下的程序,为了方便数组从1开始为有效值
private static